无法等待模块中导出的异步函数

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}`)
 })
}   

此代码也适用于您的情况。但是如果有人知道这里的这种模式不是一个好的做法,那么请告诉我。