0

私はFlexの初心者で、StackOverflowとGoogleの両方を検索しましたが、Flex / ActionScript 3非同期プログラミングのこの(単純な)問題を理解できないようです。テーブルに行を挿入するPHPサービス(Zend)があります。私がやりたいのは、異なる行の値を使用してサービスを2回連続して呼び出し、サービスから返された新しいID(主キー)を取得できるようにすることです。次に、新しいIDを2つのアラートとして表示します。

問題は、サービスを2回続けて実行できる場合、最後の最新のサービス呼び出しに対してのみAlert.show()を取得することです。最初の結果にアクセスする方法がわかりません。

FlexコードとPHPサービスを再構成してオブジェクトの配列を受け入れ、両方に対して1つの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

}

これがcallresponderとserviceの私の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'(2回目のサービス呼び出しの結果)のみがアラートをトリガーしています。どうしてこれなの?

ありがとうございました!

4

1 に答える 1

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を直接呼び出すことができます。

于 2011-08-01T15:38:40.487 に答える