Flex中的异步函数调用

时间:2009-02-19 02:42:24

标签: flex actionscript-3 actionscript asynchronous

是否可以在Flex中异步调用函数?我想定期解析文件而不会阻塞应用程序的其余部分,建议的方法是什么?

6 个答案:

答案 0 :(得分:19)

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)您想解析一个非常大的文件,但不希望应用程序在执行时挂起。

如果你想在后台处理文件,同时保持主应用程序的响应,那么我可能会创建一个函数来解析文件的几行,然后发送一个事件并返回。监听事件并启动一个等待几毫秒的计时器,然后再次调用该函数来解析下一组行。

这会破坏大文件的解析,并有足够的停机时间来保持应用程序的其余部分顺利运行。您必须使用计时器间隔和要一次解析的行数来实现响应性和解析文件所需时间的良好平衡。

希望有意义!

答案 1 :(得分:9)

最简单的答案是使用callLater例程 - 请参阅一些文档here

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

答案 2 :(得分:3)

有趣的是,就在昨天我described a solution回答different question来解决这个问题。

答案 3 :(得分:3)

您需要的是一个名为Green threads的概念。那里有一个green threading lib,但我还没有使用它。

我为导入过程(1 - 5分钟)所做的实现实际上跟踪了执行所花费的时间,并允许每个周期可配置的时间量。这允许您选择丢弃的帧数(我们只是更新模式进度条)。我还用一个版本通过一个带有IViewCursor的ICollectionView进行了子类化,然后用每个项目触发了事件。

由于它与商业产品的连接,我无法提供源代码,但这个概念实现起来非常简单。

答案 4 :(得分:1)

还有一个setInterval函数会定期调用函数,这可能很有用。

答案 5 :(得分:1)

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

干杯