什么时候承诺不再优先?
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 视频以了解事件循环的工作原理
为什么 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 视频以了解事件循环的工作原理