使用RemoteObject进行同步调用

时间:2009-04-02 04:48:34

标签: flex actionscript

有没有办法在Flex中使用RemoteObject进行同步调用?

8 个答案:

答案 0 :(得分:5)

Flex中的所有IO都是异步的。处理此问题的典型模式是使用AsyncResponder。例如:

var t:AsyncToken = remoteObject.methodCall();
t.addResponder(new AsyncResponder(resultEvent, faultEvent));

答案 1 :(得分:2)

当你希望它同步时,请三思。

你知道同步是什么意思吗?它将冻结您的应用程序,直到它收到数据。除非您非常确定您的远程呼叫可以立即收到返回值(超快速网络连接)。

如果你的函数调用依赖于彼此,我建议你实现一个状态机。 e.g。

在第一次异步调用后,您的状态变为STATE_1,您的下一个函数调用将检查此状态变量,以决定下一步移动(忽略当前调用或继续)。

我的2美分。

答案 2 :(得分:1)

如果您想要同步行为,请在拨打电话后添加等待。

编辑:我已经为我正在讨论的链接行为添加了代码。只需在以后调用remoteObject时替换结果处理程序。

...
remoteObject.function1(...);
...

private var resultHandler1(event:ResultEvent):void
{
    ...
    remoteObject.removeEventListener(resultHandler1);
    remoteObject.addEventListener(ResultEvent.RESULT, resultHandler2);
    remoteObject.function2(...);
}

private var resultHandler2(event:ResultEvent):void
{
    ...
}

答案 3 :(得分:1)

我实现了两种方式:第一,如上所述使用状态机。有时可能会变得棘手。第二,使用命令队列 - 我认为这是最好的方法......但缺点是UI在这个时候可能不是很反思。

答案 4 :(得分:0)

不,你为什么还要那样做呢。 Flex使事情异步,这样用户就不会被迫坐下来等待数据返回。 如果每次应用程序请求数据时,用户必须等待它返回,之后其他任何事情都会发生,那将是一个非常糟糕的用户。


来自评论

不,你不需要同步行为。如果您正在拨打2个电话并且呼叫2在呼叫1之前进入,但是2依赖于1内的数据那么您将离开时不要触发事件2直到1回来(这将减慢您的应用 - 就像同步事件一样)或实现一种方法来检查事件1是否已经在事件2的处理程序中返回(有很多方法可以做到这一点)。 如果您正在解雇许多事件,那么为什么没有一个包含某些描述的包装类来跟踪您的事件,并且在所有事件都回来之前不对响应做任何事情。 您可以使用AsyncToken来跟踪单个请求,因此如果您一次性触发负载,那么您可以找到最新消息,但最终没有。

答案 5 :(得分:0)

您应该尝试使用您想要接收的所有数据同时生成一个请求,然后使需要数据的不同类听取该类的正确数据。

例如:

  // request
  remoteobject.GetData(); 

  // on received request
  private function receivedData(evt:ResultEvent):void   
  {

     for each (var resultobject:ResultObjectVO in evt.result)
     {

        var eventModel:Object;

        var event:DataEvents = new DataEvents(resultobject.ResultType);
        event.data          = eventModel;

        eventdispatcher.dispatchEvent(event);
     }
  }

像这样的东西。希望这会有所帮助。

答案 6 :(得分:0)

也许如果你在Flex上调用同步XMLHttpRequest调用JavaScript,你可以这样做。

答案 7 :(得分:0)

如果您向服务器发送2个调用,那么你们都会错误地或者不使用adobe中的flex,无论每个调用对象是否具有单独的resquestObject,第二个调用对象只会在第一个调用后返回,即使是第二个处理需要1毫秒。试试斐波纳西1/40的例子。