Можно ли в Flex вызывать функцию асинхронно? Я хочу анализировать файл через равные промежутки времени, не блокируя остальную часть приложения. Каков рекомендуемый подход для этого?
Асинхронный вызов функции в Flex
Ответы (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) Вы хотите проанализировать очень большой файл, но не хотите, чтобы приложение зависало при этом.
Если вы хотите обрабатывать файл в фоновом режиме, сохраняя при этом реагирование основного приложения, я бы, вероятно, создал функцию, которая будет анализировать несколько строк файла, а затем отправлять событие и возвращать. Прослушайте событие и запустите таймер, который будет ждать несколько миллисекунд перед повторным вызовом функции для анализа следующего набора строк.
Это прервало бы синтаксический анализ большого файла с достаточным временем простоя для обеспечения бесперебойной работы остальной части вашего приложения. Вам нужно будет поиграть с интервалом таймера и количеством строк для одновременного синтаксического анализа, чтобы достичь хорошего баланса скорости отклика и времени, необходимого для синтаксического анализа файла.
Надеюсь, это имеет смысл!
Самый простой ответ - использовать процедуру 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 );
}
Интересно, что буквально вчера я описал решение к этой проблеме в ответ на разные вопрос.
Вам нужна концепция под названием Зеленые темы. Существует зеленая библиотека потоковой передачи, но я ею не пользовался.
Реализация, которую я сделал для процесса импорта (1–5 минут), фактически отслеживала, сколько времени занимало выполнение, и допускала настраиваемое количество времени на цикл. Это позволяет вам выбрать количество отброшенных кадров (мы просто обновляли модальную полосу выполнения). Я также разделил его на подклассы с версией, которая проходила через ICollectionView с IViewCursor и запускала событие с каждым элементом.
Я не могу предоставить исходный код из-за его связи с коммерческим продуктом, но эту концепцию довольно просто реализовать.
Также существует функция setInterval
, которая будет вызывать функцию через определенные промежутки времени, что может быть полезно.
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;
}
Ваше здоровье