首页 > 解决方案 > Javascript 异步函数如何在特定点显式产生控制?

问题描述

在 Javascript 异步函数中,有没有办法在代码中的特定点对事件循环产生控制?例如:

async function example() {
    doSomeWork();
    ...  // Yield control to the event loop here
    doMoreWork();
}

我尝试await了一个常量值或一个已解决的Promise,但这似乎并没有真正产生控制。

标签: javascriptasync-await

解决方案


我尝试等待一个常量值或一个已解决的 Promise,但这似乎并没有真正产生控制权。

不起作用的原因是,在 promise 解决后,下一个代码将作为microtask排队。一旦当前的同步代码堆栈完成解析,微任务就会运行,但继续事件循环中的下一个宏任务之前。因此,等待一个常量或已解决的承诺让步给其他同步代码,但它会在此之后立即恢复,而不推进事件循环。

如果你想屈服于事件循环,你需要使用 setTimeout 或 requestAnimationFrame。请注意,setTimeout 有一个最短时间,因此即使您请求 0 毫秒,它也至少是 4 毫秒。

async function example() {
  doSomeWork();
  await new Promise((resolve) => setTimeout(resolve));
  doMoreWork();
}

推荐阅读