Javascript 为什么承诺在设置超时之前执行?

Javascript 为什么承诺在设置超时之前执行?,javascript,settimeout,es6-promise,Javascript,Settimeout,Es6 Promise,在这里,我编写了3 console.log。请帮助我,为什么承诺在setTimeout之前执行,即使它有0秒延迟。据我所知,setTimeout和Promise都是在webAPI中执行的,而不是在JavaScript引擎中执行的。这件事和priorty有关吗 setTimeout(()=>console.log("SET TIME OUT"),0); // #1 var promise = new Promise((resolve,reject)=>{ resolve()

在这里,我编写了3 console.log。请帮助我,为什么承诺在setTimeout之前执行,即使它有0秒延迟。据我所知,setTimeout和Promise都是在webAPI中执行的,而不是在JavaScript引擎中执行的。这件事和priorty有关吗

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
承诺执行是微任务队列处理阶段的一部分

当计划了setTimeout函数回调时,该函数将添加到事件循环的宏任务队列中,并在主执行上下文堆栈中最后运行的代码完成时执行。然后,在事件循环的下一个滴答声中,任务/函数从事件循环宏任务队列中退出队列,并由JavaScript引擎执行

但在Promise的情况下,如果有Promise任务排队,则将在微任务队列中设置。它是在主执行上下文堆栈中的所有代码完成之后,在事件循环的下一个勾号发生之前执行的。宏任务队列中的下一个任务只有在微任务队列中的任务完全耗尽时才被拾取

无论您是否将setTimeout回调计划为0毫秒。优先级是这样的:在宏任务队列中的任务在事件循环的下一个周期中被解列以进行处理之前,微任务队列将在此之前被处理

在宏任务队列中排队的异步任务的一些示例:

setTimeout、setInterval、setImmediate、I/O任务

微任务队列中的异步任务示例:

process.nextTick节点,承诺API

承诺执行作为微任务队列处理阶段的一部分进行

当计划了setTimeout函数回调时,该函数将添加到事件循环的宏任务队列中,并在主执行上下文堆栈中最后运行的代码完成时执行。然后,在事件循环的下一个滴答声中,任务/函数从事件循环宏任务队列中退出队列,并由JavaScript引擎执行

但在Promise的情况下,如果有Promise任务排队,则将在微任务队列中设置。它是在主执行上下文堆栈中的所有代码完成之后,在事件循环的下一个勾号发生之前执行的。宏任务队列中的下一个任务只有在微任务队列中的任务完全耗尽时才被拾取

无论您是否将setTimeout回调计划为0毫秒。优先级是这样的:在宏任务队列中的任务在事件循环的下一个周期中被解列以进行处理之前,微任务队列将在此之前被处理

在宏任务队列中排队的异步任务的一些示例:

setTimeout、setInterval、setImmediate、I/O任务

微任务队列中的异步任务示例:


process.nextTick节点,Promise API

非常感谢您的帮助,我将签出microtask和macrotask。非常感谢您的帮助,我将签出microtask和macrotask。