Можно ли в 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;
}
Ваше здоровье