AS3 - 如何同步加载异步调用?

时间:2009-01-16 16:43:42

标签: flex actionscript-3

我有一个异步加载来自Web服务的用户对象的函数。

我将此函数调用包装在另一个函数中并使其同步。

例如:

    private function getUser():User{
            var newUser:User;
            var f:UserFactory = new UserFactory();

            f.GetCurrent(function(u:User):void{
                newUser = u;
            });

            return newUser;
        }

UserFactory.GetCurrent看起来像这样:

public function GetCurrent(callback:Function):void{ }

但我的理解是,无法保证在调用此函数时,newUser实际上会成为新用户吗?

如何在Flex中完成这种类型的返回功能?

4 个答案:

答案 0 :(得分:8)

这种方式疯狂存在。

说真的,你最好不要强制异步调用某种同步架构。了解事件处理系统如何对您有利,并为结果事件添加处理程序。事实上,这是直接来自flexcoders常见问题解答的建议:

Q: How do I make synchronous data calls?

A: You CANNOT do synchronous calls. You MUST use the result event. No,
you can't use a loop, or setInterval or even callLater.  This paradigm is
quite aggravating at first. Take a deep breath, surrender to the
inevitable, resistance is futile.

There is a generic way to handle the asynchronous nature of data service
calls called ACT (Asynchronous Call Token). Search for this in
Developing Flex Apps doc for a full description.

答案 1 :(得分:2)

请在此处查看我的回答:

DDD and Asynchronous Repositories

Flex和Flash Remoting本质上是异步的,因此与这种模式作斗争会给你带来很多麻烦。我们的服务代表从每个方法返回AsyncToken,我们从来没有遇到任何问题。

如果要确保应用程序在结果/错误恢复之前不呈现新视图或执行其他逻辑,则可以执行以下操作:

  1. 为将调用“post result / fault code”
  2. 的自定义事件附加事件侦听器
  3. 进行异步通话
  4. 处理结果/错误
  5. 发送自定义事件以从#1
  6. 触发您的侦听器

    请记住,每次进行异步调用时,这都会导致很多恼人的boilterplate代码。我会非常仔细地考虑你是否真的需要一个同步执行路径。

答案 2 :(得分:0)

如果没有像“sleep()”这样的函数,你就无法将异步调用转换为同步调用,据我所知,它在AS3中缺失。是的,不能保证newUser在返回语句之前包含用户名。

答案 3 :(得分:0)

AS3 port of the PureMVC framework具有在模型 - 视图 - 控制器上下文中实现同步操作的机制。它不会尝试同步异步调用,但它允许您添加用于控制它们的同步应用程序模式。

以下是一个示例实现:PureMVC AS3 Sequential Demo

在此示例中,五个子命令按顺序运行,共同组成一个完整的命令。在您的示例中,您将实现getUser()作为命令,该命令将在commandComplete()(或其他)回调中调用getURL()。这意味着下一个命令将确定getUser()操作已完成。