22

Javascript 非同期関数とコールバックを把握しようとしています。

私はいくつかの場所で読んでいるコールバック関数の概念に行き詰まりました:それらはコードの順次実行(主にアニメーションなどのjqueryのコンテキストで)と、特にNodejsのコンテキストでのいくつかの場所に使用されます。これらは、並列実行を非同期にし、コードのブロックを回避するために使用されます。

それで、このトピックの専門家がこれに光を当てて、私の心の中でこの混乱を解消してください(例??)。だから私はコールバック関数の使用法を思いつくことができました

それとも、コード内でコールバック関数を呼び出し/配置する場所にのみ依存しますか? .

ありがとう、

PS: この質問が主観的なものに近いのではないかと心配していますが、それでも具体的な回答を期待できます (おそらくいくつかの例)。

編集:実際、これは私を曖昧にするインターネットの例です:

function do_a(){
  // simulate a time consuming function
  setTimeout( function(){
    console.log( '`do_a`: this takes longer than `do_b`' );
  }, 1000 );
}

function do_b(){
  console.log( '`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`' );
}

do_a();
do_b();

結果

`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`
`do_a`: this takes longer than `do_b`

私の理解によれば、JSがシーケンシャルな場合、do_bは常にdo_aの後に来るはずです。

4

3 に答える 3

27

JavaScript のコアは、関数が完了する前にタスクを完全に完了するという点で、大部分が同期的です。AJAX が登場する前は、実際には setTimeout と setInterval だけが非同期動作を提供していました。

ただし、イベント ハンドラーは実質的に非同期コードであることを忘れがちです。ハンドラーをアタッチしてもハンドラー コードは呼び出されず、そのコードは将来の不明な時点まで実行されません。

次に、サーバーへの呼び出しを含む AJAX が登場しました。これらの呼び出しは同期するように構成できますが、開発者は一般に非同期呼び出しを好み、コールバック メソッドを使用してそれらを実装していました。

その後、JS ライブラリとツールキットが急増しました。これらは、さまざまなブラウザーの物事の実装を均質化するために努力し、非同期コードへのコールバック アプローチに基づいて構築されました。また、配列の反復や CSS クエリの結果処理などの同期コールバックが多く見られるようになりました。

現在、Deferred と Promises が混在しています。これらは、長時間実行される操作の値を表し、その値が到着したときにその値を処理するための API を提供するオブジェクトです。

NodeJS は、多くのことに対して非同期アプローチに傾いています。それくらいは本当です。ただし、これは JS 固有の非同期の性質というよりも、むしろ設計上の決定です。

于 2013-05-13T14:14:30.140 に答える
14

Javascript は常に同期 (ブロッキング) シングル スレッド言語ですが、プログラミングによって Javascript を非同期に動作させることができます。

同期コード:

console.log('a');
console.log('b');

非同期コード:

console.log('a');
setTimeout(function() {
    console.log('b');
}, 1000);
setTimeout(function() {
    console.log('c');
}, 1000);
setTimeout(function() {
    console.log('d');
}, 1000);
console.log('e');

この出力: aebcd

于 2015-05-10T20:06:32.560 に答える
3

ノード内で長時間実行されるプロセスはprocess.nextTick()、関数/コールバックをキューに入れるために使用されます。これは通常、ノードの API で行われます。プログラミング (API の外部) でブロックされているものや長時間実行されているコードを使用しない限り、実際にはあまり影響しません。以下のリンクは、私ができるよりもよく説明する必要があります。

ハウツーノード process.nextTick()

jQuery AJAX はコールバックも受け取り、次のコード ブロックに進む前にサーバーの応答を待たないようにコード化されています。サーバーが応答したときに実行する関数を記憶するだけです。これは、ブラウザーが公開する XMLHTTPRequest オブジェクトに基づいています。XHR オブジェクトは、応答が返されたときにコールバックする関数を記憶します。

setTimeout(fn, 0)javascript は、コール スタックが空になると関数を実行し (次に利用可能な空きティック)、非同期のような機能を作成するために使用できます。setTimeout(fn, 0) スタックオーバーフローに関する質問

JavaScript の非同期機能を要約すると、JavaScript 自体と同じくらい、プログラムされている環境に関係があります。API /スクリプトを使用しない限り、多くの関数呼び出しとコールバックを使用しても魔法は得られません。

Jquery Deferred Objectは、jQuery の非同期機能のもう 1 つの適切なリンクです。グーグルで調べると、jQuery Deferred がどのように機能するかについての情報が見つかるかもしれません。

于 2013-05-13T14:14:29.030 に答える