无法在模块中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
相关产品推荐
相关产品推荐

