0

在尝试解决我在序列化 cairngorm 命令执行方面的问题时,我试图完全绕过事件调度并简单地实例化我想要执行的命令,然后调用它的执行方法。在这个方法中,有一个调用调用 ServiceUtils 的委托来执行 HTTPService.send 事情......

现在,这些命令应该按照我调用它们的确切顺序运行。而且,由于服务器(RAILS)只有一个,所有请求都应该以相同的顺序返回。这不是这样..顺序因执行不同而异..为什么?!?

4

2 回答 2

1

仅仅因为您按特定顺序发送请求并不意味着响应将按该顺序返回。HTTPService 调用是异步的。例如,假设同时发送以下三个请求:

请求 1(服务器需要 4 秒处理)
请求 2(需要 0.5 秒处理)
请求 3(需要 2 秒处理)

假设网络速度是恒定的(并且许多其他环境问题是恒定的),您将首先收到请求 2 的响应,然后是请求 3,然后是请求 1。

如果您需要串行调用它们,您应该执行以下操作:

protected function doWork():void {
    request1.send();
}

protected function onRequest1Complete(e:ResultEvent):void {
    request2.send();
}

protected function onRequest2Complete(e:ResultEvent):void {
    request3.send();
}

protected function onRequest3Complete(e:ResultEvent):void {
    // you are done at this point
}

...

<mx:HTTPService id="request1" url="http://example.com/service1" result="onRequest1Complete(event)" />
<mx:HTTPService id="request2" url="http://example.com/service2" result="onRequest2Complete(event)" />
<mx:HTTPService id="request3" url="http://example.com/service3" result="onRequest3Complete(event)" />

希望有帮助。

于 2010-01-09T04:26:26.410 回答
0

RJ的回答很好地涵盖了它。只是添加到它:

您的命令将通过您使用的服务创建异步请求。如果要“模拟”命令的同步执行,则必须在先前命令请求的 resultHandler 中执行后续命令。

尽管这可能并不总是最干净的做事方式,但它可能适合您的场景。我需要更多关于服务调用的性质和应用程序的一般信息来拨打电话,无论这是否是您的最佳方法。

HTH,斯里兰卡

于 2010-01-09T04:36:40.590 回答