【问题标题】:When are promises no longer prioritized?什么时候承诺不再被优先考虑?
【发布时间】:2021-04-09 07:50:30
【问题描述】:

为什么setTimout() 优先于承诺?请看下面的两个例子。据我所知,Promise 是有优先级的,也就是说,Promise 会在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"

【问题讨论】:

    标签: javascript promise settimeout v8


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        相关资源
        最近更新 更多