我在这里写了3 console.log()
。请帮助我,为什么Promise
在setTimeout
之前执行,即使延迟为0秒也是如此。根据我的理解,setTimeout
和Promise
都在webAPI中执行,而不是在JavaScript Engine中执行。这件事与优先权有关吗?
setTimeout(()=>console.log("SET TIME OUT"),0); // #1
var promise = new Promise((resolve,reject)=>{
resolve()
})
promise
.then(()=>console.log("PROMISE")) // #2
.catch((err) => console.log(err))
console.log("SIMPLE CONSOLE LOG"); // #3
输出:
SIMPLE CONSOLE LOG
PROMISE
SET TIME OUT
Promise执行是microtask队列的一部分。
当您设置超时功能时,该功能将添加到事件循环宏任务队列中,并在主堆栈中的最后一个运行代码完成时执行。然后,在事件循环的下一个时刻,任务/功能将从事件循环队列中出队,并由JavaScript引擎执行。
但是在promise的情况下,如果有promise任务排队,将在microtask队列中设置,该队列在完成主堆栈中的所有代码之后以及事件循环的下一个计时之前执行发生。