5

関数から呼び出す場合 (すべて Java で記述):

public int hello() {
int a = 1;
executeCallback();
// C: Question lies in this range
return a;
}

public void executeCallback() {
// A: random code to execute before asynccallback
   randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() {
      onSuccess();
      onFailure();
   });
// B: random code to execute after asynccallback
}

コメント A の内容が実行され、同時に非同期の randomMethod が実行され、B のコメントが実行されることを理解しています。

ただし、randomMethod の実行中に (十分な時間がかかる場合)、関数は呼び出し元 (この場合は「hello」メソッド) に戻り、コメント C のコードの実行を開始するのでしょうか? または、executeCallback は randomMethod が終了するのを待ってから戻りますか?

前者の場合、C のコメントに進む前に、randomMethod が触れる情報が必要であると仮定します。これが当てはまることを確認するには、どうすれば「待機」させることができますか?

4

3 に答える 3

3

非同期メソッドが呼び出されると、プログラムはそのメソッドを待機しません。そのため、非同期と呼ばれます。B. で表されるコードの前に、randomMethod AsyncCallback の onSuccess または OnFailure メソッドが実行されることはありません。ブラウザは、javascript コードを単一のスレッドで実行するため、onSuccess または OnFailure メソッドは、executeCallBack メソッドの呼び出し元が終了した後に実行されます。

コード B とコード C を randomMethod の後に実行する場合は、次のように onSuccess メソッドに配置する必要があります。

randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() {
      onSuccess() {
         // B: random code to execute after asynccallback
        // C: Question lies in this range
        }
      }
      onFailure()
   });
于 2011-02-17T08:09:50.203 に答える
2

実行モデルについて少し説明させてください。「舞台裏」で何が起こっているかを知っていれば簡単な場合があるからです。

すべてのコード実行はブラウザによって開始されます。これは、ページが読み込まれたとき、ユーザーが何かをクリックしたとき、または AJAX 応答が到着したときなど、特定のイベントで発生します。

したがって、GWT (または他の JavaScript) アプリケーションを作成するときに行うことは、ハンドラーを登録することです。たとえば、 を使用するonModuleLoad()か、ボタンに ClickHandler を登録したり、GWT-RPC 呼び出しに AsyncCallback を登録したりします。

興味深い (直感に反するかもしれませんが) ことは、ブラウザーがそのようなハンドラーを呼び出すと、終了するまで (またはエラーが発生するまで) 実行されることです。その後、他のハンドラが実行されます。ちなみに、これは、1 つのハンドラーのコードに無限ループが含まれている場合、他のコールバックが実行されず、ブラウザー タブ全体がブロックされることも意味します。

したがって、hello()メソッドが実行されると、これは何らかのハンドラー (onModuleLoad または ClickHandler など) の一部として実行されます。これ

  • セットa = 1,
  • 次に、AJAX リクエスト ( randomClass.randomMethod) を送信し、
  • 別のAsyncCallbackハンドラーを登録します (これは単なる登録であることを思い出してください。ブラウザーは、その AsyncCallback ハンドラーを実際に実行する前に、まず現在のハンドラーを終了します)。
  • B を実行する
  • A を実行する
  • ハンドラが終了するまで、呼び出し階層を上に向かって実行を続けます。
于 2011-02-17T08:39:01.607 に答える
1

1] 非同期通信は慣れるまで少し時間がかかるかもしれません。サーバー上でのプロシージャの実行とサーバーからクライアントへのデータ送信にどれだけ時間がかかっても、クライアントはリモート プロシージャを呼び出した直後に次のステートメントに進むことを覚えておく必要があります。

2] 実行できます // C: 質問は onSuccess メソッドでこの範囲にあります

于 2011-02-17T08:36:44.173 に答える