Асинхронный вызов функции в Flex
Можно ли асинхронно вызывать функцию в Flex? Я хочу анализировать файл через регулярные промежутки времени, не блокируя остальную часть приложения, каков рекомендуемый для этого подход?
Ответы
Ответ 1
ActionScript не поддерживает многопоточность, и я думаю, это то, о чем вы действительно спрашиваете.
Хотя функциональность не присуща ActionScript (или Flex), вы можете настроить макет системы, используя события и таймеры.
Я немного неясен в вашем конкретном вопросе, поэтому я дам два ответа:
1) Вы хотите обработать файл каждые несколько секунд, чтобы действовать при любых изменениях.
В этом случае все, что вам нужно сделать, это настроить таймер, чтобы периодически проверять файл:
var fileTimer:Timer = new Timer(5000);
fileTimer.addEventListener(TimerEvent.TIMER, checkFile);
...
private function checkFile(event:TimerEvent):void {
// read the file and do whatever you need to do.
}
2) Вы хотите проанализировать очень большой файл, но не хотите, чтобы приложение зависало во время его выполнения.
Если вы хотите обработать файл в фоновом режиме, сохраняя при этом основное приложение в ответ, я бы, вероятно, создал функцию, которая будет анализировать несколько строк файла, а затем отправлять событие и возвращать. Прослушайте событие и запустите таймер, который будет ждать несколько миллисекунд, прежде чем снова вызвать функцию для разбора следующего набора строк.
Это сломает синтаксический анализ большого файла с достаточным временем простоя, чтобы обеспечить бесперебойную работу остальной части приложения. Вам нужно будет играть с интервалом таймера и количеством строк для синтаксического анализа сразу, чтобы добиться хорошего баланса реагирования и времени, необходимого для анализа файла.
Надеюсь, что это имеет смысл!
Ответ 2
Самый простой ответ - использовать подпрограмму callLater
- см. документацию здесь.
callLater( parseFile, [filename] );
...
public function parseFile( filename : String ) : void
{
// parse the file
}
Другой подход заключается в использовании вызова setTimeout
, определенного в пакете flash.utils
. Это позволяет вам вызывать процедуру после того, как прошло определенное количество времени. Используя эту процедуру, вы можете настроить свою функцию parseFile
, чтобы называть ее несколько раз, предоставляя вам регулярные интервалы, которые вы искали:
parseFile( filename );
...
public function parseFile( filename : String ) : void
{
// parse the file
// call this function again in 5 seconds
setTimeout( parseFile, 5000, filename );
}
Ответ 3
Интересно, что вчера я описал решение этой проблемы в ответ на разные вопросы.
Ответ 4
Вам нужна концепция Зеленые темы. Существует green threading lib, но я не использовал его.
Реализация, выполненная мной для процесса импорта (1 - 5 минут), фактически отслеживала, как долго выполнялись кавычки и разрешалось для настраиваемого количества времени за цикл. Это позволяет вам выбрать количество кадров, которые вы сбросили (мы просто обновляли модальный индикатор выполнения). Я также подклассифицировал его версией, которая проходила через ICollectionView с помощью IViewCursor и запускала событие с каждым элементом.
Я не могу предоставить исходный код из-за его связи с коммерческим продуктом, но концепция довольно проста для реализации.
Ответ 5
Существует также функция setInterval
, которая будет вызывать функцию через регулярные интервалы, которые могут быть полезны.
Ответ 6
setTimeout и setInterval обе устарели.
Класс Timer не только позволяет задержать, но и repeatCount: сколько раз он будет генерировать событие TIMER и снова начнет отсчет. Предположительно, можно было бы вызвать myTimer.stop() внутри события, прежде чем делать то, что вы хотели сделать, и myTimer.start(), когда это было сделано.
private function newLinesToParse() : void
{
myTimer = new Timer(30000, 9999);
myTimer.addEventListener(Timer.TIMER, myTimerTick);
myTimer.start();
}
private function myTimerTick(event : Event) : void
{
myTimer.stop(); // or (event.currentTarget as Timer).stop();
// do a few lines
if (anyMoreLines)
myTimer.start();
else
myTimer = null;
}
Приветствия