なぜJavaScriptがシングルスレッドでありますか?
JavaScript言語の大きな特徴は、シングルスレッドで、それは同時には一つだけを行うことができます、と言うことです。なぜJavaScriptを複数のスレッドが行う必要はありませ?これは、ああの効率を向上させることができます。
JavaScriptがシングルスレッドであり、その関連する目的。ブラウザのスクリプト言語としては、JavaScriptの主な目的は、ユーザーだけでなく、オペレーティングDOMと対話することです。これは、それが唯一のシングルスレッド、それ以外の場合は非常に複雑な同期の問題をもたらすことができると判断しました。2つのスレッドが存在するが、例えば、DOMノード上のコンテンツを追加するための1つのスレッドJavaScriptを仮定し、別のスレッドがこのノードを削除するには、ブラウザどのスレッドが優先すべきか?
だから、生まれてから、煩雑さを避けるために、JavaScriptは、この言語の中心的な特徴となっていた、シングルスレッドで変更されることはありません。
完全に管理下にJavaScriptのスクリプトは、複数のスレッドを作成することを可能にするマルチコアCPU、HTML5のWebワーカー提案された標準のコンピューティングパワーの利点が、メインスレッドの子スレッドを取るために、およびDOMを操作しなければなりません。だから、新しい標準は、シングルスレッドのJavaScriptの性質を変更しません。
イベントループ
参照アドレス:あなたは何を知っているイベントループループ?(詳細添付GIF) -空腹それ遠位端
タスクキューの性質
- すべての同期タスクが形成するメインスレッドで実行される実行スタック(実行コンテキストスタック)。
- メインスレッド以外では、「そこにあるタスクキュー」(タスクキュー)。非同期タスクがある限り、結果として実行すると、イベントが自宅で「タスクキュー」に置かれています。
- 「実行スタック」のすべての同期タスクが終了すると、システムがどのようなイベントを表示するには、「タスクキュー」を読みます。これ実行スタックに、待機状態を終了、非同期タスクに対応するものを、開始しました。
- メインスレッドは、上記の第3工程を繰り返します。
非同期タスク
- setTimeout、のsetInterval
- DOMイベント
- 約束する
達成するための非同期JavaScriptプログラミング方法?
- コールバック関数
- イベント・リスナー
- パブリッシュ/サブスクライブ
- オブジェクトを約束
- 非同期関数[ES7]
setTimeout、setImmediate、process.nextTick()のを比較すると、
setTimeout()
イベントキューへのイベントは、現在のコード(実行スタック)が実行されるまで、あなたは待つ必要があり、メインスレッドは、その指定されたコールバック関数を実行するために行くだろう。
メインスレッドの実行時間が長すぎると、我々はイベントでコールバックが指定した時間に実行されることを保証することはできません。
複数の連続したsetTimeoutを実行するときに、ブラウザのsetTimeoutたびは4msの遅れがあり、パフォーマンスの問題を引き起こして、プロセスをブロックする可能性があります。
setImmediate()
実行とイベントキューの機能のメインスレッドの直後に実行されたイベントキューテール、にイベントが終了しています。そして同じのsetTimeoutメソッド(FN、0)の効果。
この方法は、サーバ・ノードを提供します。最新のブラウザAPIは、同様の実現に持っていた:window.setImmediateを、まれにブラウザをサポートしていません。
process.nextTick()
イベントキューテールに挿入されたが、次のイベント待ち行列の前に実行されます。換言すれば、タスクは常に、すべての非同期タスクの前に、現在のメインスレッドの終了を行わ指定します。
一般的なプロセス: -現在の「実行スタック」テール>トリガープロセス指定されたコールバック関数- >次のイベントループ(メインスレッドは、「タスクキュー」を読み出す)の前に。
ウェイ・サーバ・ノードが用意されています。この方法は、問題の非同期遅延で使用することができます。
理解することができます:これは動作しません、次の予定が優先されます。
ブラウザタスク、マイクロタスク、キュー、およびスケジュール
約束する
に格納されている解決する/拒否直ちに実行されたときに解決するには、機能を実行したり、操作が非同期である場合にexecutorを、リジェクト同期されるメインスタックが完了したとき、最初の実行は、次いで/メソッドを呼び出すこと、などをキャッチ自体を約束印刷された結果が返され、実行、p個の印刷、プロミスインスタンス。
非同期のawait
非同期/待つ機能は、自己の実行を生成することです。特徴的な機能を使用すると、「同期」の形式で記述された非同期コードを生成します。
非同期関数は、関数が実行されると、イベントは、非同期動作が終了トリガされるまで、この関数文の本体の背面を行う戻りを待つ最初の約束オブジェクトを返します。非同期関数本体の外に糸を出してみましょう、として理解することができます。