在Flex中替换无限循环

时间:2010-06-18 15:54:28

标签: flex loops

我想在creationcomplete上访问webservice:getMonitorData(),并在无限循环中返回一个数组,以便每次都更新getIndex0.text。

Flex无法处理无限循环并给出超时错误1502.如果我运行for循环直到i <2000左右它才能正常工作。

如何替换循环以便连续访问我的web服务,结果显示在getIndex0.text中。

这就是我的应用程序的样子:

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300" 
         xmlns:plcservicebean="server.services.plcservicebean.*"
         creationComplete="clientMonitor1()">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.rpc.CallResponder;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;


            [Bindable] public var dbl0:Number;

//-----------Infinite Loop, Works fine if condition = i<2000------------------------
            public function clientMonitor1():void{
                for(var i:int = 0; ; i++){
                    clientMonitor();                    
                }
            }

            public function clientMonitor():void{
                var callResp:CallResponder = new CallResponder();
                callResp.addEventListener(ResultEvent.RESULT, monitorResult);
                callResp.addEventListener(FaultEvent.FAULT, monitorFault);
                callResp.token = plcServiceBean.getMonitorData();
            }

            public function monitorResult(event:ResultEvent):void{
                var arr:ArrayCollection = event.result as ArrayCollection;
                dbl0 = arr[0].value as Number;
            }

            protected function monitorFault(event:FaultEvent):void{
                Alert.show(event.fault.faultString, "Error while monitoring Data ");
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <plcservicebean:PlcServiceBean id = "plcServiceBean" 
                                       showBusyCursor="true" 
                                       fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" />
    </fx:Declarations>

    <mx:Form x="52" y="97" 
             label="Double">
        <mx:FormItem label = "getMonitorValue">
            <s:TextInput id = "getIndex0"
                         text = "{dbl0}"/>
        </mx:FormItem>
    </mx:Form>

</s:Group>

4 个答案:

答案 0 :(得分:4)

您的问题是您的循环同步运行,而实际的Web服务调用是异步的。 Flex使用基于框架的执行模型,并且只有一个执行线程 - 当您调用Web服务时,它会启动连接并立即返回。那么,永远循环意味着你永远不会真正到达可以处理结果的下一帧。循环2000次意味着您可以立即生成2000个连接,这些连接将排队,因为您不允许一次建立多个连接。然后他们将在接下来的几分钟内完成。

执行您想要执行的操作的方法可能是等待一个请求完成后再触发下一个请求。要实现此目的,您可以从事件处理程序的末尾调用clientMonitor(),或者在请求完成时专门设置一个额外的事件处理程序来调用clientMonitor()

答案 1 :(得分:1)

使用Timer

启动计时器。当它触发时,停止计时器,拨打电话。当呼叫恢复时,再次启动计时器。重复。这种类型的异步/延迟定时器循环不会用完cpu或停止其他代码。

答案 2 :(得分:0)

在我看来,你需要像LifeCycle数据服务这样的东西,它允许你保持套接字对服务器开放,并允许从服务器到客户端的推送通知。

持续点击远程网络服务对我来说似乎是一个非常糟糕的主意。

答案 3 :(得分:0)

您可以通过添加调用clientMonitor()的事件侦听器来实现伪递归,然后在clientMonitor()结尾处引发相同的事件。只需拨打clientMonitor()一次即可开始此过程。