web-dev-qa-db-ja.com

JS Promisesはシングルスレッドでどのように機能しますか

Javascriptはシングルスレッドです。これから私が理解するのは、コードの行で実行しているJS iが関数を言うかどうかです。その関数がスタックから削除されない限り、次の行に進むことはできません。

そうは言っても、インタプリタがプロミスコードを解決している間に、プロミスが他のコードブロックを実行できるようにする方法は理解できません。

私はJSの初心者なので、基礎となる実装を理解しようとしています。

私は例PHP Promisesの実装を見て、PHPは別のスレッドで別のプロセスをフォークして、メインスレッドに信号を送り返すことができます。非同期コードが実行されました。

JavaScriptでも同じように機能しますか?

ありがとう

6
user212699

並列実行、順不同、または非同期実行は、実際にはスレッドの数に関連付けられていません。考えてみてください。単一のスレッドでも、切り替えを実行し、ビット単位でn個の処理を同時に実行できます。ソフトウェアベースのCPUのようです。

それは実際に実行プラットフォームが実装される方法です。イベントキューとそのキューで動作する単一のルーパースレッドを介して、そのような処理のように見せることができます。

JavaScriptエンジンの場合、ソースコードの任意の行で定義されたすべての非同期操作について、エンジンはその操作が完了するのを待つのではなく、単にキューに入れて時々それを処理するだけだと考えることができます。完成です。

行が実行されるとき、約束された(または将来の)値には何も含まれず、次の行が評価されます。しばらくすると、値が「解決」され、その値に依存するすべても解決されます。すべて解決され、キューが空になるまで続きます。値が使用可能になり、保留中の計算が完了すると、グラフがルートに折りたたまれると考えてください。

6
S.D.

JSでの約束は非同期プログラミングを行う方法です。つまり、マルチスレッドとは違います。基本的に、同期シングルスレッドコードでは、なんらかのIOがある場合、プロセッサは他のハードウェアに命令を発行するだけで、それだけです。その後、(少なくともプログラムの観点からは)何もせずに座って、これ他のハードウェアが終了するまで待機します-これは通常、時間がかかる(CPUがその期間中に他の多くのタスクを実行できるという意味で)。したがって、Wordの通常の意味での余分なスレッドはありませんが、並行して発生する処理があります(CPUでは発生しません)。

非同期プログラミングでは、基本的に、タスクが成功(または失敗)したときに実行されるコールバックを割り当て、非同期操作を「開始」するためのコードを呼び出し、その後、独自のビジネスを続行し、その間に他の有用な作業を行います。他のハードウェアがタスクを完了する(または失敗する)と、CPUは通知を受けて適切なコールバックを実行します。

CPUが非同期イベントを処理する方法の詳細については、こちらをご覧ください こちら

参照: 同時実行vsマルチスレッドvs非同期プログラミング:説明

3

非同期タスクは、たとえば外部システムのみが関与している場合など、JSランタイムによって分岐されますが、実行する他のコードがなくなったときに開始/実行される場合もあります。最初のケースでは、少なくとも完了コールバックが後で実行されるようにスケジュールされます。 JSでは、これは、コールスタックが空になり、いわゆるイベントループが次のスケジュールされたタスクを実行するか、観測されたイベント(クリックなど)を処理するときに発生します。そのため、JSでは、無限ループや、終了しない呼び出しにつながるその他の構造を記述できない場合があります。

0
Hero Wanders