関数を「my_async_function」と説明していますが、その使用方法は非同期ではなく同期です。
サンプル コードにはブロッキングが必要です。「my_async_function」が本当に非同期 (非ブロッキング) の場合、self.write(result)
「my_async_function」を呼び出した直後に次のコード行が実行されます。関数が値を返すのに少しでも時間がかかる場合 (つまり、任意の)、最終的に何がself.write(result)
書き込まれるでしょうか? つまり、値self.write(result)
が設定される前に is が実行されるresult
と、期待した結果が得られません。したがって、「my_async_function」はブロックする必要があり、先に進む前に戻り値を待つ必要があるため、非同期ではありません。
具体的には、あなたの質問に$.sweetget('/remote/url/', {})
:それを達成するには、ajaxリクエスト(本質的に非同期であり、最初のAをAJAXに入れる)が何かを返すまでブロックできる必要があります。
sweetget
XHR の状態が変化するまでの戻りを遅らせることで同期呼び出しをハッキングできますが、while
ループ (または同様のもの) を使用して、ブラウザーの UI スレッドをブロックしたり、それらの 1 つをオフにしたりするリスクがあります。長い」警告。Javascript はスレッド制御を提供しません。現在のスレッドが待機中であると指定することはできないので、先に進んで、しばらく他のことをしてください。タイムアウトのしきい値を手動でテストすることで、これにも対処できます。
なぜコールバックを使用しないのか? どのようにスライスしても、Javascript はシングルスレッドです。いいえsleep
、いいえthread.sleep
。これは、同期コードが UI をブロックすることを意味します。
sweetget
ここでは、大まかにどのように見えるかをモックアップしました。ご覧のとおり、ブラウザー スレッドは、実行がそのタイトwhile
ループに入るとすぐにロックされます。実際、私のコンピューターでは、ブラウザが応答しないスクリプト ダイアログを表示するまで、ajax リクエストは起動しません。
// warning: this code WILL lock your browser!
var sweetget = function (url, time_out) {
var completed = false;
var result = null;
var run_time = false;
if (time_out)
run_time = new Date().getTime();
$.ajax({
url: url,
success: function(data) {
result = data;
completed = true;
},
error: function () {
completed = true;
}
}); // <---- that AJAX request was non-blocking
while (!completed) { // <------ but this while loop will block
if (time_out) {
if (time_out>= run_time)
break;
run_time = new Date().getTime();
}
}
return result;
};
var t = sweetget('/echo/json/');
console.log('here is t: ', t);
試してみてください: http://jsfiddle.net/AjRy6/