无法在模块

时间:2018-01-19 11:51:20

标签: node.js node-modules

我有一个模块:

// 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()方法。

3 个答案:

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

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