FLEX Cairngorm命令......奇怪的行为

时间:2010-01-08 18:39:05

标签: flex actionscript-3 flex3 concurrency httpservice

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

现在,这些命令应按照我称之为的确切顺序运行。 并且,由于服务器(RAILS)只有一个,所有请求都应以相同的顺序返回。 事实并非如此......订单因执行不同而有所不同......为什么?!?

2 个答案:

答案 0 :(得分: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)" />

希望有所帮助。

答案 1 :(得分:0)

RJ的回答非常清楚。只是添加它:

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

虽然这可能并不总是最干净的做事方式,但它可能适合您的情况。我需要更多关于服务电话性质和应用程序的信息来打电话,这是否是最好的方法。

HTH, 斯