TITBITS:約束


//例1 :
const p = Promise.resolve('A');

p.then(function (val) {
  console.log(val);
  p.then(function () {
    console.log('D');
  });
  console.log('B');
});

p.then(function () {
  console.log('C');
});
//例2 :
const p = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('A');
  }, 100);
});

p.then(function (val) {
  console.log(val);
  p.then(function () {
    console.log('D');
  });
  console.log('B');
});

p.then(function () {
  console.log('C');
});

例1と2の出力は?


両方とも同じ出力を記録します
観察する少数のもの
  • 約束がすぐに解決されるならば、それは重要でありません(例1)または100 ms(例2)をとってください、出力は同じままです.約束は常に非同期に動作します.
  • 電話しているp.then 複数回、すなわち、約束は一度解決されるか拒否される不変の値を持っていると解決されます.
  • 出力はなぜD B Bではありませんか?
  • // Step 1
    p.then(function (val) {
      // Step 2
      console.log(val)
      p.then(function () {
        // Step 3
        console.log('D')
      })
      console.log('B')
    })
    
    約束はイベント・ループの仕事待ち行列に加えられます.そして、それはループして、予定されたどんなコールバック・イベント待ち行列も実行するダニを持ちます.そのようなティックまたは1つのasyncループの終わりのために、それはジョブ待ち行列をチェックして、どんな呼び出しバックも実行します.
    ステップ2の中の上記の例では、JSエンジンは最初のコンソールを印刷し始め、ジョブキューとプリントbにp .を追加し、最後にジョブキューがasyncループの後に取り上げられ、ステップ3を実行します.