0

cairngorm コマンドの実行をシリアル化する際の問題を解決しようとしているときに、イベントのディスパッチを完全にバイパスして、実行したいコマンドを単純にインスタンス化し、それを execute メソッドと呼びました。このメソッドには、HTTPService.send を実行する ServiceUtils を呼び出すデリゲートへの呼び出しがあります...

さて、これらのコマンドは、私が呼び出した正確な順序で実行する必要があります。また、サーバー (RAILS) は 1 つしかないため、すべての要求が同じ順序で返されるはずです。これはそうではありません..実行ごとに順序が異なります..なぜ?!?

4

2 に答える 2

1

特定の順序でリクエストを送信したからといって、その順序で応答が返されるわけではありません。HTTPService 呼び出しは非同期です。たとえば、次の 3 つの要求が同時に送信されたとします。

リクエスト 1 (サーバーでの処理に 4 秒かかります)
リクエスト 2 (処理に 0.5 秒かかります)
リクエスト 3 (処理に 2 秒かかります)

ネットワーク速度が一定であると仮定すると (そして他の多くの環境問題が一定である場合)、最初に要求 2 に対する応答が返され、次に要求 3、次に要求 1 が返されます。

それらをシリアルで呼び出す必要がある場合は、次のようにする必要があります。

protected function doWork():void {
    request1.send();
}

protected function onRequest1Complete(e:ResultEvent):void {
    request2.send();
}

protected function onRequest2Complete(e:ResultEvent):void {
    request3.send();
}

protected function onRequest3Complete(e:ResultEvent):void {
    // you are done at this point
}

...

<mx:HTTPService id="request1" url="http://example.com/service1" result="onRequest1Complete(event)" />
<mx:HTTPService id="request2" url="http://example.com/service2" result="onRequest2Complete(event)" />
<mx:HTTPService id="request3" url="http://example.com/service3" result="onRequest3Complete(event)" />

それが役立つことを願っています。

于 2010-01-09T04:26:26.410 に答える
0

RJの答えはそれを非常によくカバーしています。それに追加するだけです:

コマンドは、使用するサービスを介して非同期リクエストを作成します。コマンドの同期実行を「シミュレート」したい場合は、前のコマンド要求の resultHandler で後続のコマンドを実行する必要があります。

これは常に最もクリーンな方法であるとは限りませんが、シナリオには適している場合があります。これがあなたにとって最善の方法であるかどうかにかかわらず、サービス呼び出しの性質と一般的な呼び出しを行うアプリに関する詳細情報が必要です。

HTH、スリ

于 2010-01-09T04:36:40.590 に答える