从Flex AS3 PHP中检索服务调用的最后2个结果

时间:2011-07-31 14:01:45

标签: flex web-services zend-framework flex4 asynctoken

我是Flex新手,我搜索了StackOverflow和Google'd,但似乎无法用Flex / ActionScript 3异步编程来解决这个(简单)问题。我有一个PHP服务(Zend),在表中插入一行。我想要做的是能够使用不同的行值连续两次调用服务,并获取服务返回的新ID(主键)。然后我将新ID显示为2个警报。

问题是当我可以连续两次服务时,我只获得最后一次和最近一次服务调用的Alert.show()。我不知道如何访问第一个结果。

我知道我可以重新配置我的Flex代码和PHP服务以接受一个对象数组,并且只为这两个对象发送一个PHP服务调用并接收一个带有结果的数组对象,但我也试图让它变得更好一般地了解AsyncToken如何工作以及如何访问我需要的旧结果。每次使用{serviceResult} .token会覆盖我以前的结果吗?

<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
   // ...

以下是我的相关代码,我想为新用户“Home”和“temp”设置2个默认文件夹:

 // imports
 import mx.collections.ArrayCollection;
 import mx.controls.Alert;
 import mx.events.CloseEvent;
 import mx.events.FlexEvent;
 import mx.rpc.AsyncToken;
 import mx.rpc.IResponder;
 import mx.rpc.events.FaultEvent;
 import mx.rpc.events.ResultEvent;
 import mx.rpc.remoting.mxml.RemoteObject;
 import mx.rpc.Responder;
 import spark.events.IndexChangeEvent;

import valueObjects.Folders;


// When the user clicks "Save" button, 2 new folders are created for a new user:
protected function pendingUserSaveButton_clickHandler(event:MouseEvent):void 
{
       // Create 2 initial user folders: Home and temp-taiwan
       var t1Folders:Folders = new Folders();

   t1Folders.users_email = tempUser.email;
   t1Folders.name = t1Folders.description = "Home";

   createFoldersFunction( t1Folders ); // assume returns folder ID = 100

   var t2Folders:Folders = new Folders();
   t2Folders.users_email = tempUser.email;
   t2Folders.name = t2Folders.description = "temp";

   createFoldersFunction( t2Folders ); // assume returns folder ID = 101
}

这是我的事件处理程序,我想要弹出每个新ID的警告框:

protected function createFoldersFunction(item:Folders):void
{
    createFoldersResult.token = foldersService.createFolders(item);
}

protected function createFoldersResult_resultHandler(event:ResultEvent):void
{
    Alert.show("Folder #" + ((event.result as int) as String) + " created");
            // Currently, I only get Alert saying "Folder #101 created".
            // I want to see 2 Alerts - one for #100 and another for #101

}

以下是我的呼叫响应和服务的mx代码:

<s:CallResponder id="createFoldersResult"
    result="createFoldersResult_resultHandler(event)"/>
<foldersservice:FoldersService id="foldersService"
    fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
    showBusyCursor="true"/>

仅'101'(第二次服务呼叫的结果)正在触发警报。这是为什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码覆盖了createFoldersResult应响应的令牌。正确的代码是:

protected function createFoldersFunction(item:Folders):void
{
    var token:AsyncToken = foldersService.createFolders(item);
    var responder:Responder = new Responder(createFoldersResult_resultHandler, someFaultHandler)
    token.addResponder(responder);
}

另一个选项是直接在mxml中为createFolders设置结果处理程序,所以你的foldersservice:FoldersService将是:

<foldersservice:FoldersService id="foldersService"
    fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
    showBusyCursor="true">
    <mx:method name="createFolders" result="createFoldersResult_resultHandler(event)"/>
</foldersservice:FoldersService>

那么你不需要createFoldersFunction,你可以直接调用foldersService.createFolders。