使用AsyncToken处理同一服务的多次调用

如何将RPC组件( HTTPService、RemoteObject或WebService)多次操作获取的所有数据一次性呈现出来呢?可以试一试AsyncToken。

AsyncToken类针对异步RPC操作提供了一个用来设置额外的或者标记级别数据的地方,它是一个动态类。这意味着,当你进行远程调用时可以任意添加属性到token上,然后在调用成功返回时或调用失败时分发的事件处理函数中读取这些属性。看下面代码:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flash/spark"
    xmlns:mx="library://ns.adobe.com/flash/mx"
    creationComplete="init()">
    <s:layout>
        <s:VerticalLayout paddingLeft="20" paddingTop="20"/>
    </s:layout>
    <fx:Script>
        <![CDATA[
            import mx.charts.series.ColumnSeries;
            import mx.rpc.AsyncToken;
            import mx.rpc.events.ResultEvent;
             
            private var _tickers:Array = ["FRED", "FE", "STRK"];
             
            private function init():void
            {
                var param:Object;
                var tok:AsyncToken = new AsyncToken();
                for each(var ticker:String in _tickers)
                {
                    param = new Object();
                    param.tickerSymbol = ticker;
                    tok = srv.send(param);
                    tok.ticker = ticker;
                }
                tok.count = _tickers.length;
            }
             
            protected function srv_resultHandler(event:ResultEvent):void
            {
                var cs:ColumnSeries = new ColumnSeries();
                cs.dataProvider = event.result.data.result;
                cs.yField = "close";
                cs.xField = "date";
                cs.displayName = event.token.ticker;
                 
                var currentSeries:Array = myChart.series;
                currentSeries.push(cs);
 
                if(event.token.count == _tickers.length)
                {
                    myChart.series = currentSeries;
                }
            }
 
        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:HTTPService id="srv"
            url="http://aspexamples.adobe.com/chart_examples/stocks-xml.aspx"
            result="srv_resultHandler(event)"/>
    </fx:Declarations>
     
    <mx:ColumnChart id="myChart"
        width="80%" height="80%"
        showDataTips="true">
        <mx:horizontalAxis>
            <mx:DateTimeAxis dataUnits="days"/>
        </mx:horizontalAxis>
    </mx:ColumnChart>
    <mx:Legend dataProvider="{myChart}"/>
</s:Application>

本实例中,我们添加了两个token属性,ticker和count,前者表示自动收录器名称,后者表示Http请求的次数。当数据在srv_resultHandler处理函数中返回时,再读取这些值。

由此可见,使用AsyncToken,可以很方便地将异步调用前的数据传递到result/fault事件处理函数中。

发表评论