【问题标题】:what works before on eventloop?Microtasks or macrotasks?以前在 eventloop 上有效吗?微任务或宏任务?
【发布时间】:2019-03-14 14:16:58
【问题描述】:

我正在调查事件循环。但我遇到了一个问题。以前在事件循环上有效吗?微任务还是宏任务? 如果我运行以下代码

Promise.resolve().then(()=> console.log('Promise'));
setTimeOut(()=>console.log("setTimeout"),0);

console.log 显示“承诺 setTimeout”; 但根据答案Difference between microtask and macrotask within an event loop context 宏任务先于微任务运行。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    Macrotasks 在其他microtasks 之前处理,但在宏任务完成后,所有计划的微任务都将运行。这样的一个推论是,如果已经安排了一些微任务,则 2 个宏任务不能一个接一个地运行。

    您当前的 JS 循环运行(您在其中运行 PromisesetTimeout)实际上是 MacrotaskPromise 安排一个微任务,setTimeout 安排一个宏任务。

    当前脚本结束时,Macrotask 结束,运行时查看微任务队列。它解析了Promise,并且如果本次运行没有安排其他微任务,它将运行下一个Macrotask。在您的情况下,这是 setTimeout 方法。

    【讨论】:

    • “当当前脚本结束时,一个宏任务结束,运行时查看微任务队列”你是什么意思。哪个宏任务结束了?
    • 当前正在运行的脚本实际上是一个宏任务。这就是结束的宏任务。
    • 第一个宏任务是随机页面上的所有脚本吗?对吗?
    • 是的,初始脚本以及您在控制台中运行的任何内容都作为宏任务运行。
    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 2019-01-18
    • 2019-01-31
    • 2014-11-12
    • 2022-11-27
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多