代码之家  ›  专栏  ›  技术社区  ›  FloatingRock

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

  •  0
  • FloatingRock  · 技术社区  · 7 年前

    我有一个模块:

    // 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")
                         ^^^^^^^^^
    

    语法错误:意外的标识符

    就好像 makeSandwich 无法看到 getCheese() 方法位于同一模块中它的正上方。

    3 回复  |  直到 7 年前
        1
  •  1
  •   FloatingRock    7 年前

    功能 makeSandwich 因为关键字 async 将结果包装为承诺。这个 await 关键字不能在承诺内使用。

    该函数可以重写如下:

    exports.makeSandwich = async function() {
      return new Promise(function(resolve, reject) {
        getCheese("Walmart").then(function(response) {
          resolve(`sandwich from ${response}`)
        })
     })
    }
    
        2
  •  1
  •   rkm    7 年前

    await 只能从内部调用 async 功能- see MDN .

    还值得注意的是,如果您使用 等候 您应该使用 try catch 用于处理错误。

        3
  •  0
  •   Kay Schneider    6 年前

    这个问题的另一个解决方案是添加关键字 async 承诺回拨。因为您的Promise回调方法不是 异步 作用 而且不能使用await关键字,但只要稍加修改,它也可以工作。
    有一件小事,承诺应该永远被抓住。

    以下是一个示例:

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

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