Flex中的异步函数调用

15

在Flex中是否可以异步调用函数?我希望定期解析文件,而不会阻塞应用程序的其余部分,这种情况下推荐使用什么方法?

6个回答

19

动作脚本不支持多线程,我认为这才是你在这里真正询问的内容。

虽然该功能不是内置于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
Flash Player在运行ActionScript时无法渲染。validateNow()方法可以强制Flex组件进行绘制,但直到帧中的所有ActionScript代码执行完成后才会实际呈现在屏幕上。 - Josh Tynjala
1
你说得完全正确,我已经从我的答案中删除了错误的代码,以免有人尝试使用它。 - Matt Guest
一个更好的方法是将解析例程分割成递归方法调用,这些调用将使用callLater进行调用。 - Yaba

9
最简单的方法是使用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 );
}

3

3
你需要的是一个名为Green threads的概念。虽然有green threading lib,但我没有使用过。
我为导入过程(1-5分钟)编写的实现实际上跟踪了执行时间,并允许每个周期配置一定的时间。这允许您选择丢失的帧数(我们只是更新模态进度条)。我还使用了子类化版本,它通过ICollectionView和IViewCursor运行,并在每个项目上触发事件。
由于它与商业产品有关,我无法提供源代码,但这个概念非常容易实现。

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

干杯


关于 setTimeout 被弃用的说法是错误的,请阅读 https://dev59.com/BnE85IYBdhLWcg3wpFEa#2688969。 «对于那些声称 setTimeout 已被弃用的人,这是一个误解..» [原文] - nalply

1

还有一个setInterval函数,可以定期调用一个函数,这可能非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接