eventloop模型中context的挂起执行是通过什么实现的?

By what is the suspended execution of context in the eventloop model?

即时给码:

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 个微任务。你知道 eventloop 在 macrotask 没有完成之前不会执行 microtasks。因为当 macrotask 完成时 #1,那么 microtask 将处于活动状态 #2 并且在这个 microtask returns 中准确地将我们编码到生成器函数 #3 中,我们将执行 console.log("World") .

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

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

by what is the code that executes generator code, resumes and restores the generator execution context? Is it a macro or micro task within the event loop when we invoke it inside a micro task?

每当在生成器上调用 next() 时都会执行它。如果该调用作为宏任务的一部分发生,它仍然是该宏任务的一部分。如果该调用作为微任务的一部分发生,它就是该微任务的一部分。实际上,在恢复生成器代码和 returns 恢复到恢复它的代码时调用堆栈实际上增加了(与 next() 一样)。

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