【发布时间】: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