web-dev-qa-db-ja.com

どのJavascript関数がブロックされているか、ブロックされていないかを決定するものは何ですか?

私は数年前からWebベースのJavascript(Vanilla JS、jQuery、Backboneなど)を行っており、最近はNode.jsでいくつかの作業を行っています。 「ノンブロッキング」プログラミングのコツをつかむのに少し時間がかかりましたが、IO操作などのコールバックの使用に慣れました。

Javascriptは本質的にシングルスレッドであることを理解しています。 Node「イベントキュー」の概念を理解しています。私が理解していないのは、個々のJavaScript操作が「ブロック」か「非ブロック」かを決定するものです。方法後のコードで使用するために同期的に出力を生成するために依存できる操作と、最初の操作が完了した後に出力を処理できるようにコールバックを渡す必要がある操作を知っていますか?JavaScriptのリストはありますか?非同期/非ブロッキングのどこかで機能する関数と、同期/ブロックの関数のリスト?Javascriptアプリが1つの巨大な競合状態になるのを妨げているものは何ですか?

IO Node and AJAX Webでの操作)のような、時間がかかる操作には、それらは非同期であり、したがってコールバックを使用します-しかし、「長い時間」と見なされるものを決定しているのは誰ですか?通常の「イベントキュー」からそれらを削除するこれらの操作内にある種のトリガーがありますか?そうでない場合、それらは変数に値を割り当てる、または配列をループするなどの単純な操作。これは、同期的に終了するために依存しているようです。

多分私はこれについて正しく考えていません-誰かが私をまっすぐにすることを願っています。ありがとう!

27
Sean

一般に、ネットワーキングを実行する関数、またはタイマーを使用して一定期間にわたって処理を実行する関数は、非同期です。

関数がコールバックを取る場合は、コールバックの用途を確認できます。通常、が非同期かどうかは明らかです。関数がコールバックを提供しない場合、非同期の結果を通信する方法がないため、おそらく非同期ではありません。

確かに言うための鉄壁の方法はありません。関数のドキュメントに記載するか、インターフェースの動作方法から明らかにする必要があります。

非同期操作は、非同期操作は同期操作とは異なり、操作の設定、操作の開始、および操作の進行状況、完了またはエラーの通知が後で行われるという点で、同期操作とは異なります。配列の反復は同期操作です。これらの問題はありません。コードは同期的に実行されます。 ajax呼び出しの発行は、状態通知のコールバックの登録、次にajax呼び出しの開始、他のJavaScriptの実行の継続、そしてしばらくしてから、コールバックはajax呼び出しの状態変更(完了など)で呼び出されます。

13
jfriend00

私が理解していることから、あなたはyoが非同期にする必要があるものについて尋ねているのではなく、関数が非同期であるかどうかを知る方法を尋ねています。

ドキュメントを確認します。真剣に-それが目的です。関数の名前やコンテキストに基づいて、関数が何をするかを推測する必要はありません。確信が持てず、ソースコードにアクセスできる場合は、それを確認してください。

それが唯一の完全に信頼できる方法です。

推測のために。

  • コールバックを受け入れるか、promiseを返す場合は、おそらく非同期です(そのルールの例外を見てきました)。
  • 一般に、node.jsで、より一般的にはJavaScriptでI/Oに関連するものはすべて非同期で行われます(そのルールの例外も見ました)。
6

JavaScriptはシングルスレッドなので、次のいずれかが発生するまですべての処理ブロックが処理されます

1)現在の実行は、I/Oやネットワーキングリクエスト、Webワーカーリクエストなどの外部サービスをリクエストします。

2)関数呼び出しがタイマーで実行され、後で実行されます

ブロッキング/非ブロッキング関数のリストはありません。ドキュメントを確認してください。

複数の外部サービスがJavaScriptスレッドをロックしているときに、アプリが競合状態になり、同時にアクセスしようとする可能性があります。最新のブラウザーとV8エンジンはこれを処理しますが、phonegapを使用してモバイルデバイス用のjavascriptアプリを作成すると、この競合状態が発生する可能性があります。これらの競合状態を処理するためのサポートはありません。

一般に、コールバックがない限り、コードブロックを想定します。そして、コールバックがあったとしても、それがブロックしないわけではありません。

4
coder