0

コールバックによって JavaScript が非同期になることを読みました。しかし、説明を理解したかどうかはわかりません。これは私が得るものです

コールバック関数を使用すると、次の行をロードする前にコールバックの前の行が完全に終了することが保証されるため、非同期で処理を実行できます。

本当?ありがとう

4

2 に答える 2

6

まず、何かを有効にするのはコールバックではありません。node.js またはブラウザーベースの JavaScript での特定の操作は、非同期であるかどうかにかかわらず、どちらかです。コールバックは通常、非同期操作の結果を通信するために使用されますが、実際にはコールバックとは何の関係もありません。

たとえば、Javascriptarray.forEach()はコールバックを使用しますが、非同期ではありません。そのため、非同期操作は非同期です。これは、基になる実装が非ブロックであるためです。関数呼び出しを行って操作を開始すると、操作はバックグラウンドで進行し、残りのコードは引き続き実行されます。一方、非同期操作が完了すると、通常はコードに完了したことを伝え、場合によっては何らかの結果を伝える必要があります。コールバック関数は、非同期操作の完了を伝えるために選択されたメカニズムです。

コールバックによって JavaScript が非同期になることを読みました。

いいえ、そうではありません。コールバックは同期操作でも使用できます。コールバックを使用するからといって、何も非同期にはなりません。操作の基盤となるネイティブ コードの実装は、非同期である必要があります (Ajax 呼び出しやその他のネットワーク操作など)。コールバックは、非同期操作の結果を通信するために使用されます。また、他の多くの非非同期用途もあります。したがって、コールバックは非同期操作で使用されるツールの 1 つにすぎず、コールバックは他の多くの用途を持つツールでもあります。とは言えませんcallback === asynchronous

コールバック関数を使用すると、次の行をロードする前にコールバックの前の行が完全に終了することが保証されるため、非同期で処理を実行できます。

これが何を意味しているのかを正確に伝えるのは難しいですが、私には間違っているように聞こえます。非同期操作を使用する場合、コードは通常、ファイルに配置された順序では実行されません。たとえば、これを行った場合:

console.log("async start");
callSomeAsyncOperation(function(result) {
    console.log("async done");
});
console.log("I'm here now");

ログに次のように表示されます。

async start
I'm here now
async done

コールバックとイベント キューの説明

非同期操作がどのように機能するかを理解することも役立つ場合があります。Javascript はイベント キューから離れて動作します。指定された一連の Javascript コードが最後まで実行されます。それが完了すると、エンジンはイベント キューを調べて、処理するイベントがまだあるかどうかを確認します。その場合、キューの最初のイベントが取り出され、そのイベント用に登録されたコールバックが呼び出されます。これにより、Javascript コードの実行の新しいシーケンスが開始されます。そのコードは、終了するまで実行され続けます。完了すると、エンジンは別のイベントをチェックします。存在する場合は、そのイベントに関連付けられたコールバックを呼び出すことによって処理されます。処理するイベントがなくなると、エンジンは次のイベントを待機するためにスリープ状態になります。イベントが発生すると (メインの Javascript スレッドの外で)、

Javascript を作成するときは、イベントの登録とイベント ハンドラーを行うことがよくあります。Javascript でこれが機能する方法は、関心のあるイベントを指定し (これには、イベントを探しているオブジェクトなどの他の情報を指定することも含まれる場合があります)、それを関数参照として渡します。本質的には、このイベントが発生したときに関数参照を呼び出すように Javascript エンジンに指示していることになります。このタイプの関数参照は「コールバック」と呼ばれます。これは単なる通常の関数ですが、それが使用されているコンテキストは「コールバック」と呼ばれます。これは、関数を実行することにより、他のコードが将来のある時点で「コールバック」するためです。次に、そのイベントに応答できる関数参照 (コールバック関数内) に適切なコードを配置できます。イベントの種類によって、1 回だけ呼び出される場合もあれば、イベントが発生するたびに呼び出される場合もあります。

このイベント キューとコールバックがどのように機能するかについては、次のリファレンスを参照してください。

ノードでコールバックを待っている間に任意のコードを実行しますか?

ノンブロッキング http サーバーでコードをブロックする

ユーザー コードを実行しない Javascript/Node の隠しスレッド: 可能ですか? もしそうなら、競合状態の不可解な可能性につながる可能性がありますか?

JavaScript はバックグラウンドで AJAX 応答をどのように処理しますか? (ブラウザについて書いていますが、コンセプトは同じです)

于 2015-10-08T00:44:13.507 に答える
1

まず、コールバックとは何か(定義上)を理解しましょう。

コンピューター プログラミングでは、コールバックは、他のコードに引数として渡される実行可能なコードの一部であり、都合のよいときに引数をコールバック (実行) することが期待されます。呼び出しは、同期コールバックのように即時に行われることもあれば、非同期コールバックのように後で行われることもあります。いずれの場合も、関数またはサブルーチンをエンティティとして指定することを意図していますが、これは言語によって異なりますが、多かれ少なかれ変数に似ています。


さて、Javascript について言えば、コールバックが常に非同期であるとは限りません。例えば:

function syncOperation(callback) {
  callback();
}

syncOperation(function() {
  console.log('a');
  console.log('b');
});

console.log('c');

このコールバックは非同期操作を行わないため、同期的です。aコンソールを開いて上記のコードを実行すると、 、 、b、 の順にログが記録されることがわかりますc


それでは、非同期の例を見てみましょう。

function asyncOperation(callback) {
  setTimeout(callback, 0);
}

asyncOperation(function() {
  console.log('a');
  console.log('b');
});

console.log('c');

最初cに 、次にa、およびが表示されbます。これは、setTimeout関数が非同期で実行されるためです。

一部の組み込み Javascript 関数は非同期であり、実行され、ある時点で、パラメーターbackとして渡された関数を呼び出します。そのため、次のようにします。

var a = 'text';
setTimeout(function() { a = 'new text'; }, 0);
console.log(a);

text変数が変更される前に実行されるため、コンソールに表示されます。

于 2015-10-08T00:48:36.127 に答える