rpc.call(mycallback);
{
//subsequent code block
}
- シングルスレッド非同期コールバックはどのように機能しますか?
- コールバックはいつ呼び出されますか?
- コールバックの実行が許可される前に、後続のコード ブロックの実行が常に終了しますか (つまり、コールバックはすべてのコードが終了した後にのみ実行されますか?)。
rpc.call(mycallback);
{
//subsequent code block
}
GWT-RPC では、非同期コールバックは次のようになります。
AsyncCallback<ResultBean> callback = new AsyncCallback<ResultBean>() {
public void onSuccess(ResultBean result) {
// Code to run once callback completes
}
public void onFailure(Throwable caught) {
// Error handling code
}
};
asyncService.call(callback);
// Subsequent code block
サーバーから結果が受信されると、onSuccess()
メソッドが呼び出されます。シングル スレッドは、キュー内の次のイベントを処理する前に現在のイベントの実行を完了する必要があるため、コールバックが完了する前に後続のコード ブロックが実行されます。コールバックが完了した後に一部のコードが実行されるようにするには、onSuccess()
メソッドから呼び出す必要があります。
これがシングルスレッド環境でどのように機能するかについての技術的な説明は次のとおりです ( Thomas Broyer からここにあります)。
GWT-RPC は、XMLHttpRequest に基づく RequestBuilder を利用します。XMLHttpRequest (XHR) はイベントを使用してコードとやり取りするため、XHR で何かが発生すると、イベントがイベント キューにプッシュされ、イベント ループによってデキューされます。
GWTのドキュメントも参照してください。
#1 javascript はシングルスレッドですが、ブラウザはそうではありません。そのため、js スレッドは xhr 呼び出しをブラウザに送信して解決し、ブラウザはすぐにコントロールを返します。
#2ブラウザがサーバーから応答を取得すると、コールバックをjsスレッドにキューに入れるため、jsが現在実行できるものをすべて終了すると実行されます(この場合、後続のコードブロック)
#3 はい、そうします。このブロックのシングル スレッド実行は、終了するまで他の遅延コード (タイムアウト、コールバック) の実行を防止するためです。
呼び出しが非同期に行われたため、コールバックがサーバーからいつ返されるかわかりません。
そう、
コードサーバー呼び出しが//subsequent code block
開始すると実行が開始され、呼び出しが終了するとonSuccess
コードブロック内のコードが実行が開始されます。
onSuccessコード ブロック と 後続のコード ブロックが独立している場合、サーバー ヒットの前または後で呼び出しても違いはありません。
両方が依存している場合
rpc.call(new AsynchCallback {
onSucees(){
//subsequent code block
}
});