2011-07-31 50 views
0

我是一個Flex新手,我搜索了StackOverflow和Google'd,但似乎無法弄清楚Flex/ActionScript 3異步(簡單)問題節目。我有一個PHP服務(Zend)在表中插入一行。我想要做的是能夠以不同的行值連續調用兩次服務,並獲取服務返回的新ID(主鍵)。然後我顯示新的ID爲2警報。從Flex AS3服務調用中檢索最後2個結果PHP

問題是,當我可以連續兩次服務時,我只收到最近和最近的服務調用的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" 
    // ... 

這裏是我的相關代碼,我想建立新用戶「家」和「溫度」 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 

} 

,這裏是我的的CallResponder和服務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

您的代碼重寫了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。

+0

感謝您的迴應!使用你的第一個解決方案,我得到一個有關將IResponder類型映射到IResponder類型的錯誤。如果我將「響應者」作爲IResponder的代碼運行,我不會得到結果或警報。使用第二種解決方案我的Flash Builder 4.5不識別mx:方法(「無法解析爲組件實現」)。我怎樣才能讓其中的一個運行? – Tabnaka

+0

您是否爲第一種情況製作了正確的進口產品?響應者是IResponder。第二個,mx命名空間也應該被導入。 –

+0

好吧,我在原始問題中添加了我的導入語句。我終於通過在我的代碼中將「Responder」的所有引用替換爲「mx.rpc.Responder」來實現它的工作。即使把上面的導入聲明仍然會給我關於使用flash.net:Responder的投訴。謝謝!! – Tabnaka