web-dev-qa-db-ja.com

Javascriptはデフォルトで同期(ブロッキング)または非同期(非ブロッキング)ですか

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

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

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

または、コード内でコールバック関数を呼び出したり配置したりする場所にのみ依存しますか?

ありがとう、

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

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

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の後に来る必要があります。

21

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

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

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

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

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

NodeJSは、多くのことへの非同期アプローチに傾いています。それだけは本当です。ただし、これはJSの固有の非同期性ではなく、設計上の決定です。

24
Dancrumb

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');

この出力:a e b c d

11
Deepak Sisodiya

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

howtonode process.nextTick()

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

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

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

jquery Deferred Object jQueryの非同期機能のもう1つの優れたリンクです。グーグルを使用すると、jQueryDeferredがどのように機能するかについての情報が見つかります。

3
Adam