コールバックを使用すると、Javascriptコードはどのように非同期になりますか?


26

非同期のJavaScriptコードの書き方を見つけようとして、私はオンラインで多くの本を読んでいます。私の研究でよく出てきたテクニックの1つは、コールバックを使用することです。コールバック関数を作成して実行する方法のプロセスは理解していますが、コールバックがJavaScriptの実行を自動的に非同期にするのはなぜかと混乱しています。したがって、私の質問は、コールバック関数をJavaScriptコードに追加すると、コードが自動的に非同期になるのですか?


2
:あなたは、ブラウザがジョンResig氏によって書かれたシングルスレッド内でこれを達成する方法読書に興味があるかもしれませんejohn.org/blog/how-javascript-timers-work
Jalayn

@Jalayn。ありがとう。あなたのコメントは、いくつかの答えを読んだ後、すべての違いをもたらしました。
kushalvm

回答:


26

そうではありません。コールバックを取得するか、コールバックを渡すだけでは、非同期であるとは限りません。

たとえば、.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の非同期イベントにフックするには常にコールバックが必要ですが、それは関数の呼び出しやそれらの受け渡しが常に非同期であることを意味するものではありません。


2
@SteveEvers その後、MDNの記事を編集できると思います。コールバックは、指定した関数を使用してコールバックする別の関数に渡される関数のjavascriptで非常に一般的な用語です...なぜそれを複雑にするのですか?編集:コールバックは仕様で
エサイリア共和国

3
@SteveEvers「コールバックは非同期を意味する」は、C#/ Microsoftの特異性です。en.wikipedia.org/wiki/Callback_(computer_programming)–
エサイリージャ

1
@MikeBrown私は彼のプロフィールを読みすぎていると思いますが、これは最も間違いのない答えであり、確かに「コールバックは非同期性を意味する」という考えを与えます。
エサイリヤ

1
しかし、@ SteveEversと言われていることも間違っています。コールバックは非同期を意味するのではなく、誰かが「コールバック」の責任を負います。
マイケルブラウン

1
スティーブエバーズが間違っているため+1
slebetman

23

「魔法」の秘密は、コールバックを割り当てるイベントが非同期であることです。JSサンドボックスの外部のバックグラウンドで、実行中のあらゆる処理(リモートサーバーからの取得など)を処理するために、「内部」で実装されています。そして、作業が完了したら、イベントを呼び出すためのメッセージをJSエンジンに渡します。JSエンジンが現在実行していることをすべて完了すると、キューに入れられた(または新しいメッセージを待つ)イベントを呼び出し、コールバックが非同期で「魔法のように」呼び出されます!

注:これは、異なるJSエンジンがさまざまな方法で物事を実装するため、詳細に入らないトピックの非常に高レベルの概念的な概要です。しかし、これはそれがどのように機能するかの一般的な考えです。)


これらはどのイベントですか?1つまたは2つのそのようなイベントの例は、あなたの答えをさらに良くします。
ジョースモ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.