在Flex中是否可以异步调用函数?我希望定期解析文件,而不会阻塞应用程序的其余部分,这种情况下推荐使用什么方法?
在Flex中是否可以异步调用函数?我希望定期解析文件,而不会阻塞应用程序的其余部分,这种情况下推荐使用什么方法?
动作脚本不支持多线程,我认为这才是你在这里真正询问的内容。
虽然该功能不是内置于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
}
另一种方法是使用flash.utils
包中定义的setTimeout
调用。这个调用让你在经过指定的时间后调用一个例程。使用这个例程,你可以设置你的parseFile
函数反复调用自身,从而达到您所期望的定期间隔:
parseFile( filename );
...
public function parseFile( filename : String ) : void
{
// parse the file
// call this function again in 5 seconds
setTimeout( parseFile, 5000, filename );
}
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;
}
干杯
还有一个setInterval
函数,可以定期调用一个函数,这可能非常有用。