Асинхронный вызов функции в Flex

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


person Abdullah Jibaly    schedule 19.02.2009    source источник


Ответы (6)


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) Вы хотите проанализировать очень большой файл, но не хотите, чтобы приложение зависало при этом.

Если вы хотите обрабатывать файл в фоновом режиме, сохраняя при этом реагирование основного приложения, я бы, вероятно, создал функцию, которая будет анализировать несколько строк файла, а затем отправлять событие и возвращать. Прослушайте событие и запустите таймер, который будет ждать несколько миллисекунд перед повторным вызовом функции для анализа следующего набора строк.

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

Надеюсь, это имеет смысл!

person Matt Guest    schedule 19.02.2009
comment
Flash Player не выполняет рендеринг во время работы ActionScript. validateNow () заставит компонент Flex рисовать, но на самом деле он не будет отображаться на экране до тех пор, пока не завершится выполнение всего ActionScript в кадре. - person Josh Tynjala; 21.02.2009
comment
Вы абсолютно правы, я удалил ошибочный код из своего ответа, чтобы никто не пытался его использовать. - person Matt Guest; 25.02.2009
comment
Гораздо лучший способ - разделить процедуру синтаксического анализа на рекурсивные вызовы методов, которые будут вызываться с помощью callLater. - person Yaba; 01.06.2011

Самый простой ответ - использовать процедуру 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 );
}
person Matt Dillard    schedule 19.02.2009

Интересно, что буквально вчера я описал решение к этой проблеме в ответ на разные вопрос.

person erikprice    schedule 19.02.2009

Вам нужна концепция под названием Зеленые темы. Существует зеленая библиотека потоковой передачи, но я ею не пользовался.

Реализация, которую я сделал для процесса импорта (1–5 минут), фактически отслеживала, сколько времени занимало выполнение, и допускала настраиваемое количество времени на цикл. Это позволяет вам выбрать количество отброшенных кадров (мы просто обновляли модальную полосу выполнения). Я также разделил его на подклассы с версией, которая проходила через ICollectionView с IViewCursor и запускала событие с каждым элементом.

Я не могу предоставить исходный код из-за его связи с коммерческим продуктом, но эту концепцию довольно просто реализовать.

person Richard Szalay    schedule 22.02.2009

Также существует функция setInterval, которая будет вызывать функцию через определенные промежутки времени, что может быть полезно.

person igkuk7    schedule 19.02.2009

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;
}

Ваше здоровье

person Richard Haven    schedule 20.02.2009
comment
повторно не рекомендуется, прочтите stackoverflow.com/questions/2683398/timer- vs-settimeout / «Для всех, кто говорит, что setTimeout устарел, это не имеет смысла ..» [sic] - person nalply; 07.04.2011