どのJavascript関数がブロックと非ブロックを決定するのですか?


27

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

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

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

おそらく、私はこれを正しく考えさえしていないでしょう。ありがとう!


あなたの質問に対するあなたの答えは、メソッドが非同期であるかどうかを調べるためにドキュメントを確認する必要があるということであるにもかかわらず、これは私が本当に有用であることがわかったものです。
アナスタシオスアンドロニディス14年

回答:


13

一般的に、ネットワーキングを行ったり、タイマーを使用して一定期間にわたって処理を行う機能は非同期です。

関数がコールバックを取る場合、コールバックが何に使用されているかを見ることができ、通常は非同期かどうかが明らかです。関数がコールバックを提供しない場合、非同期結果を通信する方法がないため、おそらく非同期ではありません。

確実に伝えるための鉄壁の方法はありません。関数のドキュメントで綴られているか、インターフェースの動作方法から明らかである必要があります。

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


1
追加の注記として、一部のJavascript関数は、パラメーターに応じて、ブロック化と非ブロック化の両方を行います。たとえば、次の呼び出しが非同期かどうかを制御XMLHttpRequest.openするブールasyncパラメータsendがあります。
ブライアン

この答えは役に立たず、一般的に説明されていません。
メフディRaash

@MehdiRaash-答えは、ドキュメントまたはインターフェースから理解することです。他の方法はありません。それがそういうことです。他に何を期待していたのかわかりません。特効薬はありません。
jfriend00

6

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

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

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

推測のために。

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

4

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

1)現在の実行は、I / Oまたはネットワーク要求、またはWebworker要求などの外部サービスを要求します

2)関数呼び出しは、後で実行されるタイマーに入れられます

ブロッキング/ノンブロッキング関数のリストはありません。ドキュメントを確認する必要があります。

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

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


-1

私もnode.js(およびJavaScript全般)が初めてであり、あまり非同期のコードには慣れていません。私はちょうどであることを指摘したかったノンブロッキング対ブロッキングの概要nodejs.orgそれはそれを述べています:

Node.js標準ライブラリのすべてのI / Oメソッドは、非同期バージョンを提供します。これは非ブロッキングであり、コールバック関数を受け入れます。一部のメソッドには、対応するブロックがあり、名前の末尾がSyncになっています。


1
これは質問にどのように対処しますか?回答方法を
-gnat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.