0

現在、Flex に依存して、ExternalInterface コールバックを介して重労働の一部を行う Javascript コードがあります。それは世界で最も美しいものではありませんが、うまくいきます。Flex 側では、次のように定義します (remoteCall は典型的な RemoteObject の動作を持つラッパーです)。

ExternalInterface.addCallback("doOperation",
    function(data:String, windowId:String):void { doOperation(data, windowId) });

private function doOperation(data:String, windowId:String):void {
    remoteService.remoteCall(data, function(e:ResultEvent):void {
        ExternalInterface.call("doOperationComplete", windowId, e.result);
    });
}

Javascript 側には次のものがあります。

function doOperationComplete(windowId, result) {
    var win = windowHandles[windowId];
    win.handleResult(result);
}

これはほとんどのユースケースでうまく機能しますが、基本的なタスク監視を実装しようとしているので、もっと良い方法があることを願っています。上記と同じパスをたどると、タスクのステータスを取得するために JS -> Flex 呼び出しが行われるシナリオに行き着きます。その呼び出しは void を返し、その呼び出しが完了すると、Flex -> JS 呼び出しがあり、JS にタスク ステータスが与えられます。次に、JS はステータスを確認し、なんらかのアクションを実行する必要があります。あきらめて、結果に対して何かを行い、遅延後に再度ステータスを確認します (別の JS -> Flex、Flex -> JS サイクル)。

私はまだこれをコーディングし始めていませんが、複数のタスクを管理し、Javascript への Flex 呼び出しを元のコールバックに関連付け、適切にスコープされたデータを渡すなどで、すぐに非常に複雑になるようです。

良い代替手段はありますか?この種のコールバック シナリオ用に設計された Javascript タスク プラグインのようなものはありますか? 私が見落としているデザインパターンはありますか?doOperationvoid の代わりにタスク ステータスを返すように、リモート サービス呼び出しを同期するなどの疑わしい手法でさえありますか?

4

1 に答える 1

1

Adobe が IResponder を作成したときに行ったようなことをするだけです。

呼び出しの処理を担当する各呼び出しを行うときにオブジェクトを作成し、特定の呼び出しに関連付ける他のデータ (IResponder の AsyncToken など) の「スポット」を持っています。そのオブジェクトは、往復が終了したときにイベントを送出する必要があり、そのイベントを使用して、「スポット」またはそのスポットを持つオブジェクトへの参照を取得できます。

データの読み取り/書き込みの処理を少しきれいにするために、純粋なフラッシュでこれを行いました。呼び出しに関する情報を記憶し、呼び出しが完了したときに COMPLETE イベントを生成する別のクラスでローダーをラップしました。COMPLETE イベントを取得したら、ラッパーから関連情報を読み取り、すべてを破棄します。

私の記憶では、これは RemoteObject および HTTPService コードの動作と同じではありませんが、思考プロセスは似ています。F3 を使用していずれかのソース コードに移動し、Adobe がそれをどのように処理したかを正確に確認し、独自のタスクのパターンに従ってみてください。

于 2013-03-28T16:45:58.393 に答える