Асинхронный вызов функции в 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 );
}

Ответ 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;
}

Приветствия