18.6.跟踪多个同时发生的服务调用的结果

18.6.1. 问题
我想确定返回的数据是多个同时发生的服务中哪个调用返回的结果。
18.6.2. 解决办法
在每个服务中添加ASyncToken 变量标记。
18.6.3. 讨论
因为mx.rpc.ASyncToken 是一个动态类,可以在运行期添加属性和方法。Flex 文档里描述的是“一个为异步RPC 操作设置额外的或标记级别的数据的地方”。

例如,假定有个应用程序使用DateChooser 控件,每次用户选择一个新的月份时,你需要接收服务器上关于此月份的一个xml 文件。因为没有方法规定这些返回来的文件的顺序,所以你需要一个办法来识别它们。使用ASyncToken,你可以添加一个标记属性到服务返回的result 事件上,如:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxmllayout="horizontal"> <mx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.AsyncToken;
import mx.events.DateChooserEvent;
private function scrollHandler(event:DateChooserEvent):void {
var month:int = event.currentTarget.displayedMonth;
var monthName:String = event.currentTarget.monthNames[month];
service.url = "xml/"+monthName+".xml";
var token:AsyncToken = service.send();
token.resultHandler = onResult;
token.faultHandler = onFault;
token.month = monthName;
}
private function onResult(event:ResultEvent):void {
resultText.text = "MonthName: "+event.token.month+"\n\n";
resultText.text += "Result: "+event.result.data.month;
}
private function onFault(event:FaultEvent):void {
resultText.text = event.fault.faultString;
}

]]>
</mx:Script>
<mx:HTTPService id="service"
result="event.token.resultHandler(event)"
fault="event.token.faultHandler(event)"/>

<mx:DateChooser id="dateChooserscroll="scrollHandler(event)"/>
<mx:TextArea id="resultTextwidth="300height="200"/>
</mx:Application>

上面的代码调用scrollHandler 事件接收来自服务器的XML 文件。如果用户点击的很快,你可能在同一时间就会有多个请求发送出去。在HTPPService 里, send 方法返回一个ASyncToken,这样你可以访问它并添加属性标记这个月份到底是和哪个数据一起返回的。

你可以使用ResultEvent 的token 属性访问你设置的month 属性。

这个方法也可以用在WebService 和RemoteObject 调用上。这些调用中,操作或方法被调用后返回ASyncToken :
+展开
-ActionScript
var token : AsyncToken = service.login( loginVO );

加支付宝好友偷能量挖...


评论(0)网络
阅读(119)喜欢(0)flash/flex/fcs/AIR