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

无法在模块中await导出的async函数?模块内await报错求助

问题根源:await 不能在非 async 函数中使用

你遇到的这个报错和 getCheese 的作用域完全没关系,错误的核心是:你在一个普通函数(Promise 的回调函数)里使用了 await,但只有 async 函数内部才能使用 await。

看你的 makeSandwich 函数:

exports.makeSandwich = async function() {
  return new Promise(function(resolve, reject) {
    let response = await getCheese("Walmart") // 这里的回调函数是普通函数,不能用await
    resolve(`sandwich from ${response}`)
  })
}

虽然 makeSandwich 本身是 async 函数,但你在它内部又嵌套了一个普通的 Promise 回调函数,await 写在这个普通函数里,JS 引擎就会报错。

修复方案(两种可选)

方案一:去掉多余的手动 Promise(推荐)

因为 async 函数本身会自动返回一个 Promise,所以完全不需要手动 new Promise,直接在 async 函数里写逻辑就行:

// 修复后的 sandwich.js
function getCheese(msg) {
  return new Promise(function(resolve, reject) {
    setTimeout(function(){
      resolve(`cheese from ${msg}`)
    }, 1000);
  })
}
exports.makeSandwich = async function() {
  let response = await getCheese("Walmart")
  return `sandwich from ${response}`
}

这样修改后,makeSandwich 作为 async 函数,内部可以正常使用 await,而且返回值会被自动包装成 Promise,和你原来的逻辑完全一致,但代码更简洁规范。

方案二:给 Promise 回调加上 async(不推荐,没必要嵌套)

如果你非要保留手动创建 Promise 的写法,必须把回调函数改成 async:

exports.makeSandwich = async function() {
  return new Promise(async function(resolve, reject) { // 这里加async
    let response = await getCheese("Walmart")
    resolve(`sandwich from ${response}`)
  })
}

不过这种写法完全是画蛇添足,因为 async 函数本身已经返回 Promise 了,嵌套 Promise 没有任何必要。

验证修复结果

运行你的调用代码:

t = require('./sandwich.js')
async function eat() {
  let sandwich = await t.makeSandwich()
  console.log("ate", sandwich)
}
eat()

1秒后会正常输出:ate sandwich from cheese from Walmart

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:46:15