【问题标题】:Why Promise is executed before setTimeout? [duplicate]为什么 Promise 在 setTimeout 之前执行? [复制]
【发布时间】:2020-07-13 14:29:41
【问题描述】:

这里我写了 3 个console.log()。请帮助我,为什么 PromisesetTimeout 之前执行,即使它有 0 秒的延迟。据我了解,setTimeoutPromise 都是在 webAPI 中执行的,而不是在 JavaScript 引擎中。这东西跟优先级有关吗?

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

【问题讨论】:

    标签: javascript settimeout es6-promise


    【解决方案1】:

    Promise 的执行是 microtask 队列处理阶段的一部分。

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

    但在Promise 的情况下,如果有Promise 任务排队,那将被设置在微任务 队列中。在主执行上下文堆栈中的所有代码完成之后并且在事件循环的下一个滴答发生之前执行。 macrotask 队列中的下一个任务只有在 microtask 队列中的任务完全耗尽时才会被拾取。

    无论您是否将setTimeout 回调安排在0 毫秒。优先级是这样的,即在 macrotask 队列中的任务出队以在事件循环的下一个滴答中进行处理之前,microtask 队列将在此之前处理。

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

    setTimeoutsetIntervalsetImmediate、I/O 任务

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

    process.nextTick(节点),Promise API

    【讨论】:

    • 非常感谢您的帮助,我会去结帐microtaskmacrotask
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2021-06-25
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多