Apache flex 检查CallResponder是否正在处理
我使用的是Flash Builder 4.6。作为一个简单的示例,假设我有以下应用程序:Apache flex 检查CallResponder是否正在处理,apache-flex,asynchronous,Apache Flex,Asynchronous,我使用的是Flash Builder 4.6。作为一个简单的示例,假设我有以下应用程序: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:sdk="services.sdk.*"> <fx:Script>
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:sdk="services.sdk.*">
<fx:Script>
<![CDATA[
private function btnGetValue_clickHandler():void
{
getValueResult.token = sdk.getValue();
}
private function getValueResultHandler():void
{
// ...
}
]]>
</fx:Script>
<fx:Declarations>
<sdk:SDK id="sdk" fault="{Alert.show(event.fault.faultString +'\n\n'+ event.fault.faultDetail, 'SDK ERROR');}" showBusyCursor="false"/>
<s:CallResponder id="getValueResult" result="getValueResultHandler()"/>
</fx:Declarations>
<s:Button id="btnGetValue" click="btnGetValue_clickHandler()" label="Get Value" />
</s:Application>
有没有更好的办法解决这个问题
编辑: 我需要解决的一个实际场景是循环:
private function btnGetValue_clickHandler():void
{
var arr:Array = new Array("value1", "value2", "value3");
for each (var value:String in arr)
getValueResult.token = sdk.getValue(value);
}
因此,为了解决这个问题,我将arr
设为一个全局变量,并使用前面介绍的setInterval
方法将第一个元素移出,然后在结果函数中执行相同的操作,直到arr
为空
同样,如果存在这样的问题,请寻找更“标准”的解决方案。如果呼叫是基于按钮的,请在单击时禁用按钮。启用回调末尾的按钮。简单。您可能希望自己管理服务呼叫的响应,而不是使用呼叫响应程序。调用HTTPService.send()方法时,HTTPService(或类似的Flex服务)返回一个AsyncToken
。然后可以使用AsyncToken.addResponder()
方法添加“结果”和“错误”处理程序
如果您这样做,每个响应程序将触发相应的结果或错误处理程序。然后使用Sam DeHaan建议的最后一种方法,在调用时将每个令牌存储在数组中,并在执行“结果”或“错误”处理程序时从数组中删除令牌。从阵列中删除令牌时,如果阵列为空,则可以重新启用该按钮
您可以这样做(从内存中键入代码):
我更新了我的问题。当我在循环中进行调用时,这个解决方案对我不起作用。在这种情况下,我将按顺序执行这些操作,并在项目数组为空时重新启用按钮。但是,如果你想并行处理,我没有一个好的解决方案。我考虑过做类似的事情,通过Actionscript创建一个CallResponder数组,但是结果处理程序方法如何知道哪个令牌(数组中的哪个条目)调用它?我不认为我可以依赖于每个调用返回的顺序与它们被调用的顺序相同。这正是AsyncToken所做的。它保证您所做的调用将仅由您分配给它的结果/错误处理程序(通过addResponder()
方法:)处理。下面是一个详细讨论此问题的示例。听起来这就是我要寻找的。谢谢
private function btnGetValue_clickHandler():void
{
var arr:Array = new Array("value1", "value2", "value3");
for each (var value:String in arr)
getValueResult.token = sdk.getValue(value);
}
var service:HTTPService = new HTTPService();
// configure the service...
var token:AsyncToken = service.send();
// resultHandlerMethod and faultHandler method are functions that you should define
// their signatures look like this:
// resultHandlerMethod(event:ResultEvent)
// faultHandlerMethod(event:FaultEvent)
token.addResponder(new Responder(resultHandlerMethod, faultHandlerMethod);