在 Javascript 异步函数中,有没有办法在代码中的特定点对事件循环进行控制?例如:async function example() { doSomeWork(); ... // Yield control to the event loop here doMoreWork();}我尝试await使用常量值或resolved Promise,但这似乎并没有真正产生控制。
2 回答
绝地无双
TA贡献1946条经验 获得超4个赞
我尝试等待一个恒定值或一个已解决的 Promise,但这似乎并没有真正产生控制。
不起作用的原因是,在 Promise 解析后,下一个代码将作为microtask排队。当前同步代码堆栈完成解析后,微任务就会运行,但在事件循环中继续执行下一个宏任务之前。因此,对常量或已解决的承诺的等待将产生其他同步代码,但它将在那之后立即恢复,而不推进事件循环。
如果您想屈服于事件循环,则需要使用 setTimeout 或 requestAnimationFrame。请注意,setTimeout 有一个最小时间量,因此即使您请求 0 毫秒,它也至少为 4 毫秒。
async function example() {
doSomeWork();
await new Promise((resolve) => setTimeout(resolve));
doMoreWork();
}
HUX布斯
TA贡献1876条经验 获得超6个赞
你可以做类似的事情
const yielder = () => new Promise((resolve) => setTimeout(() => resolve(), 0))
然后
await yielder();
添加回答
举报
0/150
提交
取消