0

ネイティブJavaアプリをGWTに変換中です。サーバーとの通信は状態変化時にのみ発生し、これまではブロッキング操作で処理されていました。

例:現在の同期ロジック:

void onUserClickedSync() {
    downloadData(); // blocking operation
    uploadData(); // blocking operation
    setState(DONE);
}

ブロッキング操作を非同期コールバックを利用する操作に置き換えるにはどうすればよいですか?

私の現在の考えは、本質的に何もしない余分な「ビジー」状態の束を追加することです。次に、RPCからのコールバックを使用して、ロジックを続行できる次の状態をトリガーします。

たとえば、同期ロジックは次のようになります。

void onUserClickedSync() {
    rpc.downloadData(new AsyncCallback<Data> {
        public void onSuccess(Data result) {
            //...
            onDownloaded();
        }
        //...
    });
    setState(WAITING_FOR_DOWNLOAD);
}

void onDownloaded() {
    rpc.uploadData(new AsyncCallback<Void> {
        public void onSuccess(Void void) {
            //...
            setState(DONE);
        }
    //...
    });
    setState(WAITING_FOR_UPLOAD);
}

このアプローチは有効ですか?気をつけなければならないことはありますか?

編集:非常に不明瞭だったので、私の例を擬似コードで書き直しました。

4

2 に答える 2

1

リモートインタラクション用のインターフェイスを設計するときは、通常、待ち時間を短縮するために、操作を可能な限り粗くする必要があります。

特に、「ダウンロード」と「アップロード」を1つの操作に統合できます。このようにして、単一のラウンドトリップまでの遅延を減らし、複数の待機状態を排除できます。

于 2012-05-28T14:23:13.723 に答える
1

わかりました、質問であなたを悩ませて申し訳ありませんが、例は私には本当に明確ではありませんでした。

はい、状況をうまく処理できたので、あなたのアプローチは実行可能だと思います。コールバックがシステムの状態を変更するときに、同時に発生している他のイベントと衝突する可能性のある「副作用」がないことに注意してください。

具体的には、「複数のコールバックを待機している」かどうかは明確ではありません(つまり、ユーザーが4つのアップロードを開始するため、必ずしも「正しい順序」ではなく、4つのコールバックを受け取る可能性があります)。また、uploaddataメソッドが対応するdownloaddataの前に終了する可能性はありますか?

以前のコードは予測可能性のために応答性を犠牲にしましたが(たとえば、最初のダウンロードが完了するまで何も起こらない)、今ではより予測できない順序で物事が起こり、適切に行うのが非常に難しい微妙なバグが発生する可能性があるため、一般的に注意する必要があります診断または再現します。

アプリケーションの残りの部分が表示されないため、コールバック間で他に何が発生する可能性があるかは明確ではありませんが、それについては十分に注意し、コールバックエラー処理を特に堅牢にすることをお勧めします(つまり、アップロードが途中で失敗しますか?サーバーから、中止されたことを通知するコールバックがまだ届きますか?そのときどの状態に移行しますか?)

于 2012-05-28T17:52:11.343 に答える