事件循环模型中上下文暂停执行由什么控制?generator恢复属于什么任务?
回答
1. 恢复generator执行上下文的主体
是JavaScript引擎本身,该过程和普通函数执行的上下文调度逻辑没有本质差异。
generator的执行上下文会在你第一次调用next()时创建,执行到yield关键字后,该上下文会被挂起并保存在generator实例(也就是你代码中的gen对象)中。后续每次调用next()时,引擎都会直接把这个之前挂起的上下文重新推到调用栈顶部,从暂停位置继续同步执行,直到遇到下一个yield或者generator函数执行结束,再把上下文弹出挂起。整个过程是调用栈层面的同步操作,和事件循环的任务分类没有直接绑定关系。
2. 微任务内调用恢复逻辑的任务归属
你在哪个任务上下文中调用gen.next(),恢复执行的逻辑就归属到哪个任务下。
你示例代码中是在Promise的then回调(微任务)中调用的gen.next(),那么next()触发的所有generator内部代码执行,包括console.log("World")的执行,都是当前微任务内的同步代码,会在当前微任务的执行周期内全部跑完,不会单独生成新的任务。
3. 恢复后的generator上下文的任务属性
不存在“generator执行上下文对应独立任务”的说法,generator的执行完全依附于调用它的上下文:
- 你在主宏任务中第一次调用
gen.next()打印Hello,这段逻辑就归属主宏任务 - 你在微任务中调用
gen.next()打印World,这段逻辑就归属微任务 - 如果你把
gen.next()放到setTimeout的回调中,它就归属对应的宏任务
generator本身只是支持暂停/恢复的可执行对象,本身不会产生新的事件循环任务,所有执行时机完全由你调用它的位置决定。
内容的提问来源于stack exchange,提问作者MaximPro
相关产品推荐
相关产品推荐

