Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Линейное выполнение методов (http://www.flasher.ru/forum/showthread.php?t=158227)

Deadly0 17.06.2011 00:59

Линейное выполнение методов
 
Здравствуйте. Во флеше есть ряд методов, которые не возвращают результат своей работы, а вызывают событие, куда передают результат. Например метод FileReference.load().

Можно ли обернув этот метод в другую функцию заставить выполниться линейно, т.е. чтобы было так:
Код AS3:

var file = wrapLoad(fr);


wvxvw 17.06.2011 01:12

Неа, в большинстве случаев нет. В некоторых случаях можно через какой-нибудь хак, типа вызова фунции за пределами флеша, которая будет синхронно делать то же самое, что во флеше бы делалось асинхронно, но как правило ничего хорошего из этого не выйдет.

Wolsh 17.06.2011 01:21

Гораздо эффективней будет поменять мышление и мыслить событиями, а не кадрами. Дело не в том, куда передается результат, а когда он будет получен. Время на получение файла неизвестно и никак не зависит от кода, но уж точно не равно нулю. Измените свою логику – другого пути просто нет, Вам не создать мгновенный интернет во всем мире, по-крайней мере не сейчас))) Приложение это не линейная последовательность [кадров, процедур], приложение реагирует на события, время и порядок которых неизвестны (зависят от действий юзера) – логично что оно состоит из блоков, реагирующих на определенные события. Линейности тут просто нет места и никогда не было.

Deadly0 17.06.2011 01:38

Мне нужно из выбранных пользователем файлов (FileReferenceList.browse()) получить информацию из этих файлов, записать инфу в массив и вызвать функцию JS. Хотелось бы так, но getData() использует load():

Код AS3:

var data: Array = [];
 
for (var i: uint = 0, len: uint = files.length; i < len; i++)
{
        data.push(getData(files[i]));
}
 
ExternalInterface.call('flashExternalCall_selectedFilesHandler', data);

Если добавлять данные по событию загрузки, то когда вызывать ExternalInterface.call('flashExternalCall_selectedFilesHandler', data)?

Wolsh 17.06.2011 01:42

Создавать очередь с отслеживанием, и когда все будут загружены - переходить к следующему этапу.

Deadly0 17.06.2011 01:48

Т.е при каждом возникновении события загрузки файла, проверять все ли файлы обработаны и тогда вызвать JS функцию?

Код AS3:

private function loadHandler(event)
{
    data.push(event.data);
 
    if (data.length === files.length)
    {
        ExternalInterface.call('flashExternalCall_selectedFilesHandler', data);
    }
}

Это считается правильным подходом?

S-ed 17.06.2011 01:53

В мануле как раз рассматривается такой вариант с LIST_COMPLETE event:
http://help.adobe.com/en_US/FlashPla...renceList.html

Wolsh 17.06.2011 01:57

Ну идея такая, да. Реализация конечно содержит больше.. нюансов. Например push не гарантирует порядок в data как в files, а он бывает важен (возможно, не в такой ситуации).

Deadly0 17.06.2011 02:08

S-ed, Wolsh, спасибо, вроде бы идею понял :)


Часовой пояс GMT +4, время: 13:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.