我有一个模块:
// 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:意外的标识符
好像makeSandwich
无法在同一模块中看到正上方的getCheese()
方法。
答案 0 :(得分:1)
函数makeSandwich
内部不需要promise,因为关键字async
将结果包装在Promise中。 await
关键字不能在promise中使用。
该功能可以按如下方式重写:
exports.makeSandwich = async function() {
return new Promise(function(resolve, reject) {
getCheese("Walmart").then(function(response) {
resolve(`sandwich from ${response}`)
})
})
}
答案 1 :(得分:1)
await
只能在async
函数 - see MDN内调用。
另外值得注意的是,如果您使用await
,则应使用try catch
来处理错误。
答案 2 :(得分:0)
此问题的另一个解决方案是将关键字async
添加到Promise回调中。因为你的Promise回调方法不是async
函数。
并且不能使用await关键字,但只需稍作修改即可
一件小事,应该总是抓住Promise。
以下是一个例子:
<!-- 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}`)
})
}
此代码也适用于您的情况。但如果有人知道这种模式是不是一个好习惯,请告诉我。