什么时候承诺不再优先?

When are promises no longer prioritized?

为什么 setTimout() 优先于承诺?请看下面的两个例子。据我了解,Promises 是有优先级的,换句话说,Promises 会在 setTimeout() 之前执行。下面的第一个例子证明了这一点。

console.log("First");

setTimeout(() => console.log("Second"), 0);

console.log("Third");

const promise = new Promise(function (resolve, reject) {
      resolve("Forth");
      reject(new Error("Rejected"));
});
promise.then((res) => console.log(res)).catch((err) => console.log(err));
//output:

//"First"
//"Third"
//"Forth"
//"Second"

但是 如果我们在 promise 中有一个 setTimeout(),它将不再被优先考虑。不再是承诺了吗?为什么会这样?第二个示例不应该与第一个示例具有相同的输出吗?

console.log("First");

setTimeout(() => console.log("Second"), 0);

console.log("Third");

const promise = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve("Forth");
    reject(new Error("Rejected"));
  }, 0);
});
promise.then((res) => console.log(res)).catch((err) => console.log(err));

//"First"
//"Third"
//"Second"
//"Forth"

setTimeout 有一个 最小 超时期限,这意味着它将:

  • 总是在立即解决的承诺之后出现。
  • 导致 resolve,在您的第二个示例中,在第一次超时触发 console.log.
  • 后立即被调用

您需要了解事件循环的工作原理。在第一种情况下,setTimeout("second") 被放入队列,所有同步任务首先执行。在第二种情况下,首先将 setTimeout("second") 放入队列中,当执行 promise 时,将 setTimeout("fourth") 推入事件队列,这就是为什么 fourth 在 two 之后打印的原因。您可以查看 this 视频以了解事件循环的工作原理