非同期のJavaScriptコードの書き方を見つけようとして、私はオンラインで多くの本を読んでいます。私の研究でよく出てきたテクニックの1つは、コールバックを使用することです。コールバック関数を作成して実行する方法のプロセスは理解していますが、コールバックがJavaScriptの実行を自動的に非同期にするのはなぜかと混乱しています。したがって、私の質問は、コールバック関数をJavaScriptコードに追加すると、コードが自動的に非同期になるのですか?
非同期のJavaScriptコードの書き方を見つけようとして、私はオンラインで多くの本を読んでいます。私の研究でよく出てきたテクニックの1つは、コールバックを使用することです。コールバック関数を作成して実行する方法のプロセスは理解していますが、コールバックがJavaScriptの実行を自動的に非同期にするのはなぜかと混乱しています。したがって、私の質問は、コールバック関数をJavaScriptコードに追加すると、コードが自動的に非同期になるのですか?
回答:
そうではありません。コールバックを取得するか、コールバックを渡すだけでは、非同期であるとは限りません。
たとえば、.forEach
関数はコールバックを取得しますが、同期的です。
var available = false;
[1,2,3].forEach( function(){
available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here
setTimeout
あまりにもコールバックを取り、非同期です。
function myFunction( fn ) {
setTimeout( function() {
fn(1,2,3);
}, 0 );
}
var available = false;
myFunction( function() {
available = true;
});
//available is never true here
Javascriptの非同期イベントにフックするには常にコールバックが必要ですが、それは関数の呼び出しやそれらの受け渡しが常に非同期であることを意味するものではありません。
「魔法」の秘密は、コールバックを割り当てるイベントが非同期であることです。JSサンドボックスの外部のバックグラウンドで、実行中のあらゆる処理(リモートサーバーからの取得など)を処理するために、「内部」で実装されています。そして、作業が完了したら、イベントを呼び出すためのメッセージをJSエンジンに渡します。JSエンジンが現在実行していることをすべて完了すると、キューに入れられた(または新しいメッセージを待つ)イベントを呼び出し、コールバックが非同期で「魔法のように」呼び出されます!
(注:これは、異なるJSエンジンがさまざまな方法で物事を実装するため、詳細に入らないトピックの非常に高レベルの概念的な概要です。しかし、これはそれがどのように機能するかの一般的な考えです。)