无法等待模块中导出的异步函数
Can't await exported async function in module
我有一个模块:
// sandwich.js
function getCheese(msg) {
return new Promise(function(resolve, reject) {
setTimeout(function(){ resolve(`cheese from ${msg}`) }, 1000);
})
}
exports.makeSandwich = async function() {
return new Promise(function(resolve, reject) {
let response = await getCheese("Walmart")
resolve(`sandwich from ${response}`)
})
}
..和调用此模块的文件:
t = require('./sandwich.js')
async function eat() {
let sandwich = await t.makeSandwich()
console.log("ate", sandwich)
}
eat()
这是简单的代码,它 看起来 很好,但是当我 运行 它时,我得到错误:
let response = await getCheese("Walmart")
^^^^^^^^^
SyntaxError: Unexpected identifier
就好像 makeSandwich
在同一模块中看不到它上面的 getCheese()
方法。
函数 makeSandwich
不需要在其中使用 promise,因为关键字 async
将结果包装在 Promise 中。 await
关键字不能在承诺中使用。
函数可以重写为:
exports.makeSandwich = async function() {
return new Promise(function(resolve, reject) {
getCheese("Walmart").then(function(response) {
resolve(`sandwich from ${response}`)
})
})
}
await
只能从 async
函数中调用 - see MDN.
还值得注意的是,如果您使用 await
,您应该使用 try catch
来处理错误。
此问题的另一种解决方案是将关键字 async
添加到 Promise 回调中。因为您的 Promise 回调方法不是 async
函数。
并且不能使用 await 关键字,但稍作改动也可以。
一件小事,Promises 应该总是被抓住。
这是一个例子:
<!-- language: lang-js -->
exports.makeSandwich = async function() {
return new Promise(async (resolve,reject) => {
let response = await getCheese("Walmart").catch(()=>{ /* do something */ })
resolve(`sandwich from ${response}`)
})
}
此代码也适用于您的情况。但是如果有人知道这里的这种模式不是一个好的做法,那么请告诉我。
我有一个模块:
// sandwich.js
function getCheese(msg) {
return new Promise(function(resolve, reject) {
setTimeout(function(){ resolve(`cheese from ${msg}`) }, 1000);
})
}
exports.makeSandwich = async function() {
return new Promise(function(resolve, reject) {
let response = await getCheese("Walmart")
resolve(`sandwich from ${response}`)
})
}
..和调用此模块的文件:
t = require('./sandwich.js')
async function eat() {
let sandwich = await t.makeSandwich()
console.log("ate", sandwich)
}
eat()
这是简单的代码,它 看起来 很好,但是当我 运行 它时,我得到错误:
let response = await getCheese("Walmart") ^^^^^^^^^
SyntaxError: Unexpected identifier
就好像 makeSandwich
在同一模块中看不到它上面的 getCheese()
方法。
函数 makeSandwich
不需要在其中使用 promise,因为关键字 async
将结果包装在 Promise 中。 await
关键字不能在承诺中使用。
函数可以重写为:
exports.makeSandwich = async function() {
return new Promise(function(resolve, reject) {
getCheese("Walmart").then(function(response) {
resolve(`sandwich from ${response}`)
})
})
}
await
只能从 async
函数中调用 - see MDN.
还值得注意的是,如果您使用 await
,您应该使用 try catch
来处理错误。
此问题的另一种解决方案是将关键字 async
添加到 Promise 回调中。因为您的 Promise 回调方法不是 async
函数。
并且不能使用 await 关键字,但稍作改动也可以。
一件小事,Promises 应该总是被抓住。
这是一个例子:
<!-- language: lang-js -->
exports.makeSandwich = async function() {
return new Promise(async (resolve,reject) => {
let response = await getCheese("Walmart").catch(()=>{ /* do something */ })
resolve(`sandwich from ${response}`)
})
}
此代码也适用于您的情况。但是如果有人知道这里的这种模式不是一个好的做法,那么请告诉我。