为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript 异步函数如何在特定点显式地产生控制?

Javascript 异步函数如何在特定点显式地产生控制?

繁花如伊 2023-07-29 15:50:08
在 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();

}


查看完整回答
反对 回复 2023-07-29
?
HUX布斯

TA贡献1876条经验 获得超6个赞

你可以做类似的事情

const yielder = () => new Promise((resolve) => setTimeout(() => resolve(), 0))

然后

await yielder();


查看完整回答
反对 回复 2023-07-29
  • 2 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信