是否有一种在Flex中同步多个异步结果的通用方法?

时间:2011-09-01 23:41:47

标签: flex actionscript-3 asynchronous synchronization

我一直想知道我们是否有本地或通用方法来同步Adobe Flex中异步HttpService调用的多个结果。换句话说,我需要从我的服务器恢复一些数据并在我从这些不同的函数中恢复所有数据后执行一个函数。

以下是一个例子:

private var mObj01 : Object = null;
private var mObj02 : Object = null;
private var mObj03 : Object = null;

public function TryLoadSynchronousFunction() : void
{
    if( mObj01 != null && mObj02 != null && mObj03 != null )
        DoSynchronizedStuff();
}

public function GetObj01( event : ResultEvent ) : void
{
    mObj01 = event.result as Object;
    TryLoadSynchronousFunction();
}

public function GetObj02( event : ResultEvent ) : void
{
    mObj02 = event.result as Object;
    TryLoadSynchronousFunction();
}

public function GetObj03( event : ResultEvent ) : void
{
    mObj03 = event.result as Object;
    TryLoadSynchronousFunction();
}

public function StartAsynchronous() : void
{
    myCall01.token = httpObj.Get01();
    myCall02.token = httpObj.Get02();
    myCall03.token = httpObj.Get03();
}

<fx:Declarations>我会:

<mx:CallResponder id="myCall01" result="GetObj01(event)" />
<mx:CallResponder id="myCall02" result="GetObj02(event)" />
<mx:CallResponder id="myCall03" result="GetObj03(event)" />

这种情况有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

首先,CallResponders在演示代码中是可以的(例如Adobe提供的演示),但实际上 - 这在应用程序中不是一个好的实现。您需要创建一些服务代理来处理与服务器的所有交互:

http://www.developria.com/2008/04/anatomy-of-an-enterprise-flex-8.html

此外,在这种情况下,我建议使用Swiz框架查看类似链接API的内容,作为将一组异步任务链接在一起的选项。

http://swizframework.jira.com/wiki/display/SWIZ/Chaining+API

答案 1 :(得分:1)

你也可以使用Parsley的任务框架:

http://www.spicefactory.org/parsley/docs/2.4/manual/task.php#intro

它支持异步任务。

var group:TaskGroup = new SequentialTaskGroup("some description for log output");
group.ignoreChildErrors = false;
group.addTask(new GetObj01Task());
group.addTask(new GetObj02Task());
group.addTask(new GetObj03Task());
group.addEventListener(TaskEvent.COMPLETE, doSynchronizedStuff);
group.addEventListener(ErrorEvent.ERROR, onError);
group.start();

public class GetObj01Task extends Task {

function SoundTask () {
    super();

    setCancelable(false);
    setSuspendable(false);
    setSkippable(false);    
}

protected override function doStart () : void {
     // do your http service call and register 
     // result handler on onComplete method and
     // fault handler on onError method
}

private function onComplete (event:Event) : void {
    // call task framework task success
    complete();
}

private function onError (event:ErrorEvent) : void {
    error("Error playing sound file " + filename + ": " + event.text);
}

}