まず、数3つの議論のためのステートメント及びt1
、t2
、f1
とf2
として匿名関数を識別タイマー(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ライブラリの間で異なる可能性があります。
ブラウザについてはわかりませんが、これはノードの動作が文書化されていることが必要です。https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ –