ActionScript 3 / Flex / AIR で 1:1 の非同期コールバック/イベントを実装する最良の方法は?

StackOverflow https://stackoverflow.com/questions/53025

質問

私が活用してきたのは、 コマンドパターン 私の Flex プロジェクトでは、以下の間で非同期コールバック ルートが必要です。

  • 特定のコマンド オブジェクトとコマンド オブジェクトをインスタンス化した人、
  • コマンド オブジェクトと「データ アクセス」オブジェクト (つまり、コマンド オブジェクトが呼び出すリモート プロシージャを処理する人がネットワーク経由でサーバーに呼び出します。

これら 2 つのコールバック ルートはそれぞれ、1 対 1 の関係にできる必要があります。これは、特定のコマンド クラスの複数のインスタンスがまったく同じジョブを同時に実行している可能性があるためですが、パラメーターはわずかに異なり、それらのコールバックが混同されることは望ましくありません。AS3 で非同期性を処理するデフォルトの方法であるイベントの使用は、本質的に 1 対多の関係に基づいているため、ほとんど使用できません。

現在、私はこれを使用してこれを行っています コールバック関数のリファレンス 特定の種類の署名が付いているのですが、私は疑問に思っていました 誰かがより良い(または代替の)方法を知っていたら?

私の現在の方法を説明するための例を次に示します。

  • を生成するビュー オブジェクトがあるかもしれません。 DeleteObjectCommand 何らかのユーザーアクションにより、インスタンスが 2 つの独自のプライベートメンバー関数に参照を渡します (1 つは成功、もう 1 つは失敗:まあ言ってみれば "deleteObjectSuccessHandler()" そして "deleteObjectFailureHandler()" この例では)、コマンド クラスのコンストラクターへのコールバック関数参照として使用されます。
  • 次に、コマンド オブジェクトは、「データ アクセス」オブジェクトへの接続でこのパターンを繰り返します。
  • ネットワーク上の RPC が正常に完了すると (または失敗すると)、最初に「データ アクセス」オブジェクト、次にコマンド オブジェクトによって適切なコールバック関数が呼び出され、最後に最初の操作で操作をインスタンス化したビュー オブジェクトが呼び出されます。場所はその場所に通知される deleteObjectSuccessHandler() または deleteObjectFailureHandler() と呼ばれた。
役に立ちましたか?

解決

もう 1 つのアイデアを試してみます。

データ アクセス オブジェクトが、RPC 呼び出しから取得される AsyncToken の代わりに、独自の AsyncToken (または保留中の呼び出しをカプセル化する他のオブジェクト) を返すようにします。したがって、DAO では次のようになります (これは非常に大雑把なコードです)。

public function deleteThing( id : String ) : DeferredResponse {
    var deferredResponse : DeferredResponse = new DeferredResponse();

    var asyncToken : AsyncToken = theRemoteObject.deleteThing(id);

    var result : Function = function( o : Object ) : void {
        deferredResponse.notifyResultListeners(o);
    }

    var fault : Function = function( o : Object ) : void {
        deferredResponse.notifyFaultListeners(o);
    }

    asyncToken.addResponder(new ClosureResponder(result, fault));

    return localAsyncToken;
}

DeferredResponse そして ClosureResponder もちろんクラスは存在しません。自分で発明する代わりに、次のようなものを使用できます AsyncToken の代わりに DeferredResponse, 、しかし、の公開バージョン AsyncToken レスポンダーをトリガーする方法がないようなので、とにかくサブクラス化する必要があるでしょう。 ClosureResponder 単なる実装です IResponder 成功または失敗時に関数を呼び出すことができます。

とにかく、上記のコードの仕事のやり方は、RPC サービスを呼び出し、保留中の呼び出しをカプセル化するオブジェクトを作成し、そのオブジェクトを返し、RPC が戻ったときにクロージャの 1 つを返すことです。 result または fault が呼び出されますが、RPC 呼び出しが行われたときのスコープへの参照がまだ残っているため、保留中の呼び出し/遅延応答でメソッドをトリガーできます。

コマンドでは次のようになります。

public function execute( ) : void {
    var deferredResponse : DeferredResponse = dao.deleteThing("3");

    deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
    deferredResponse.addEventListener(FaultEvent.FAULT,   onFault);
}

または、次のようにしてパターンを繰り返すこともできます。 execute メソッドは、コマンドが DAO から取得する遅延応答がトリガーされたときにトリガーされる独自の遅延応答を返します。

しかし。これは特に美しいとは思いません。おそらく、この種の問題を多かれ少なかれ正確に解決するために存在する多くのアプリケーション フレームワークの 1 つを使用すれば、より優れた、より複雑でなく、より複雑でない何かを実行できるでしょう。私の提案は次のとおりです メイト.

他のヒント

Flex RPC クラスの多くは次のようなものです。 RemoteObject, HTTPService, 、など。戻る AsyncToken電話をかけるとき。これがあなたが求めているもののようです。基本的には AsyncToken 保留中の呼び出しをカプセル化し、コールバックを (次の形式で) 登録できるようにします。 IResponder インスタンス) を特定の呼び出しに送信します。

の場合 HTTPService, 、電話をかけると send()AsyncToken が返され、このオブジェクトを使用して特定の呼び出しを追跡できます。 ResultEvent.RESULT, これは、どの通話であるかに関係なくトリガーされます (また、通話は送信された順序とは異なる順序で簡単に着信する可能性があります)。

AbstractCollection は、Flex / AIR で永続オブジェクトを処理する最良の方法です。GenericDAO が答えを提供します。

DAOは、ValueObject(JavaのPojoとして知られている)で行われるCRUD操作およびその他の共通操作を実行することができるオブジェクトです。GenericDAO は、汎用的に使用できる再利用可能な DAO クラスです。ゴール:

Java Ibm GenericDaoでは、新しいDAOを追加するために、実行するステップは単純に、ValueObject(POJO)を追加することです。value オブジェクトの hbm.xml マッピング ファイルを追加します。DAO 用の 10 行の Spring 構成ファイルを追加します。

同様に、AS3 プロジェクト Swiz DAO でも同様です。私たちも同様の成果を達成したいと考えています。

クライアント側の GenericDAO モデル:私たちはクライアント側言語に取り組んでいたので、永続オブジェクト Collection (valueObject ごと) も管理する必要があります。使用法:ソース:http://github.com/nsdevaraj/SwizDAO

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top