【问题标题】:By what is the suspended execution of context in the eventloop model?事件循环模型中上下文的暂停执行是什么?
【发布时间】:2022-01-11 10:16:36
【问题描述】:

立即给出代码:

setTimeout(() => console.log("next macro")); /// next macro
Promise.resolve().then(() => gen.next()) /// microtask inside, #2
const gen = (function*(){
    console.log("Hello");
    yield; /// #3
    console.log("World");
})();
gen.next();
console.log("main script has been ended"); /// #1

如您所知,生成器可以暂停。所以稍后我们可以在某些代码会调用与生成器相关的某些代码时回到生成器函数。

此代码有 2 个宏任务和 1 个微任务。您知道在宏任务尚未完成之前,事件循环不会执行微任务。因为当macrotask 将完成#1,然后microtask 将是活动的#2,并且这个microtask 中的确切代码将我们返回到生成器函数#3,我们将执行console.log("World")。

所以我的问题是:执行生成器代码、恢复和恢复生成器执行上下文的代码是什么?当我们在微任务中调用它时,它是事件循环中的宏任务还是微任务?当我们执行它时,生成器的恢复执行上下文是一个微任务吗?

P.S 你可能不明白,因为我不知道如何正确表达我的想法。

【问题讨论】:

    标签: javascript ecmascript-6 specifications


    【解决方案1】:

    执行生成器代码、恢复和恢复生成器执行上下文的代码是什么?当我们在微任务中调用它时,它是事件循环中的宏任务还是微任务?

    只要在生成器上调用next(),就会执行它。如果该调用作为宏任务的一部分发生,它仍然是该宏任务的一部分。如果该调用作为微任务的一部分发生,则直到该微任务的一部分。实际上,调用堆栈在恢复生成器的代码时增加了,并返回到恢复它的代码(如next())。

    因为在您的示例中,您在同步代码和then 回调中都调用了next(),所以它首先作为宏任务的一部分执行,然后作为微任务的一部分执行。从这个意义上说,它与进行函数调用没有什么不同。

    【讨论】:

    • 好吧,所以在我的情况下,当我在微任务中调用 next() 时,之后执行的代码也是微任务。对吗?
    • 是的,微任务只有在调用栈变空时才结束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多