2017-11-11 2 views
0
Promise.resolve().then(() => { 
    console.log('promise2') 
    setTimeout(() => console.log('setTimeout2')) 
}) 
setTimeout(() => { 
    console.log('setTimeout1') 
    Promise.resolve().then(() => console.log('promise1')) 
}) 

ブラウザのコードの実行結果: ブラウザとノードのEventLoopの違いは何ですか?

promise2 -> setTimeout1 -> promise1 -> setTimeout2 

が、ノードにおける

promise2 -> setTimeout1 -> setTimeout2 ->promise1 
+0

ブラウザについてはわかりませんが、これはノードの動作が文書化されていることが必要です。https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ –

答えて

0

まず、数3つの議論のためのステートメント及びt1t2f1f2として匿名関数を識別タイマー(t)と約束(f)コールバックを達成する:

引数がない約束やthenableあるとき が Promise.resolveを想定し f2が約束ジョブキュー(PJQ)である

書1の場所は、同期的に満たさ約束を返します。完了した約束にthenを呼び出すと、コール中に完了したハンドラの実行がPJQにディスパッチされ、約束ジョブキューが処理されたときに後で実行されます。

ステートメント2は、タイマーコールバックキューにt1を配置します。


実行されると、約束ハンドラはthen又はcatchによって返される約束のためエグゼキュータコードによって監視されます。


プロセス約束ジョブキューを優先して、ブラウザ内のキュー、:

PJQ: f2 
TimerQ: t1 

コールf2は、タイマーキュー

PJQ:  <empty> 
Timers: t1, t2 

コールさt1、ログにT2を追加し、 "promise2を" ログ"setTimeout1"、文3を実行し、f1を約束ジョブキューに追加します。

PJQ: f1 
Timers: t2 

コールf1は、 "setTimeout2を" ログ "promise1"

PJQ: <empty> 
timers: t2 

コールT2を記録します。

プロミスジョブキューがタイマーコールバックよりも優先度が高い場合、ログは "promise2"、 "setTimeout1"、 "promise1"、 "setTimeout2"と表示されます。タイマーと雇用を約束するが、優先順位なしで、作成した順番に処理されたキュー


プロセス:

F2、T1

ログ "promise2" は、T2

T1を追加し、 T2

ログ "setTimeout1"、追加F1

T2、F1

ログ "setTimeout2"

F1

ログ "promise1"

報告ように同じ優先度で、ログは "promise2"、 "setTImeout1"、 "setTimeout2"、 "promise1" ですノード用。


TLDR;

ブラウザは、タイマーコールバックよりも応答性の高いジョブを優先させます。ノードはタイマーと約束の仕事を同等に優先させますが、文書をチェックすることと一貫しています。

これは、コールバックをタイマーとジョブキューの実行を約束するために与えられた優先順位に依存しているコードの約束アーキテクチャにveryBadIdea(TM)です。これは、ホスト環境(ブラウザとノード)によって異なります。また、古いブラウザでは、既に使用されている、またはPromiseのpolyfillとして組み込まれているネイティブPromiseライブラリとJavaScript promiseライブラリの間で異なる可能性があります。

関連する問題