You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何正确await无返回值的void异步函数?

问题原因分析

你的两次代码都无法达到预期的核心原因是:setTimeout 属于异步宏任务,不会阻塞主线程执行。你之前编写的asyncer函数执行时,只会把setTimeout的回调推入异步任务队列,就立刻返回了状态为已完成的Promise,此时await识别到Promise已完成,就会直接执行后续代码,等主线程任务全部清空后才会执行setTimeout的回调打印async msg,因此才会出现打印顺序颠倒的问题。

解决方案

要让await等到setTimeout内部逻辑执行完成再往下走,需要把异步逻辑包装成可主动控制状态的Promise,在异步操作完成的位置手动触发resolve即可。如果是无返回值的void场景,直接resolve空值即可:

function asyncer() {
  // 手动返回Promise,自行控制异步完成的触发时机
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("async msg")
      // 异步逻辑执行完成后再resolve,通知await可以继续向下执行
      resolve()
    }, 0)
  })
}

async function helloer() {
  await asyncer()
  console.log("hello")
}

helloer()

上述代码运行后会先打印async msg,再打印hello,符合预期效果。如果不需要asyncer返回任何业务值,resolve不传入任何参数即可,完全满足你要await无返回值void函数的需求。

内容的提问来源于stack exchange,提问作者Jip Helsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:15:04