【问题标题】:Javascript `await` "SyntaxError: Unexpted identifier" even if I am awaiting inside an `async` functionJavascript `await` “SyntaxError: Unexpected identifier” 即使我在 `async` 函数中等待
【发布时间】:2020-01-28 05:20:42
【问题描述】:

当我在 async 模块中等待时,Javascript await 会出现以下错误

let ImagesArray = await getImages();
                            ^^^^^^^^^
SyntaxError: Unexpected identifier
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:607:28)
    at Object.Module._extensions..js (module.js:654:10)
    at Module.load (module.js:556:32)
    at tryModuleLoad (module.js:499:12)
    at Function.Module._load (module.js:491:3)
    at Module.require (module.js:587:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (C:\Users\junai\Desktop\giantbomb-api-test\index.js:8:17)

这是我的代码 sn-p。我做错了什么?

    async function getImages(){
        return new Promise(function(resolve, reject) {
            request.get("URL", function (error, response, body) {
                let images = JSON.parse(body).results.map((image)=>{
                    return image.original_url;
                })
                resolve(images);
        });
      })
    }


    module.exports = async function addGame(req, res){
      let ImagesArray = await getImages();
      ImagesArray.forEach(URL => {
          images.push({
              "data": URL,
              "uploadType" : "url",
              "type": "image/jpeg",
              "name": game.name
          })
      });
      console.log(images);
    }

另一方面,以下代码有效,但输出不同:

var images = [{
    "image": {
        "data": "FIRST IMAGE",
        "uploadType": "url",
        "type": "image/jpeg",
        "name": game.name
    }
}];
(async function main() {
    let ImagesArray = await getImages();
    ImagesArray.forEach(URL => {
        images.push({
            "data": URL,
            "uploadType": "url",
            "type": "image/jpeg",
            "name": game.name
        })
    });
    console.log(images); // [{"image" : {"data": "FIRST IMAGE", "uploadType" : "url", "type": "image/jpeg", "name": game.name } }, {...}, {...} ]
})();
console.log(images); // [{"image" : {"data": "FIRST IMAGE", "uploadType" : "url", "type": "image/jpeg", "name": game.name } }]

【问题讨论】:

  • 运行你的 sn-p,它会给出一个 ReferenceError(运行时),而不是一个 SyntaxError - 语法看起来不错。 (可能您的环境不支持await,需要更改配置或升级?)
  • @CertainPerformance 它被标记为node.js,它可能不打算在浏览器中运行。并且回溯表明错误是在导入文件时发生的,而不是在尝试运行函数时发生的。
  • @CertainPerformance 如果我在异步 IIFE (async function() {})(); 中运行该函数,那么它不会给出错误,但我需要 await 结果在一个变量中,并且 IIFE 限制了范围。
  • 你在哪个版本的 node.js 中运行它?
  • @Bergi 这是 v8.9.4

标签: javascript node.js promise async-await


【解决方案1】:

第二个sn-p的问题是main函数是异步执行的。在执行完成之前打印images

由于async 函数返回Promise,您可以像这样使用then

var images = [{
    "image": {
        "data": "FIRST IMAGE",
        "uploadType": "url",
        "type": "image/jpeg",
        "name": game.name
    }
}];

async function main() {
   let ImagesArray = await getImages();
   ImagesArray.forEach(URL => {
       images.push({
           "data": URL,
           "uploadType": "url",
           "type": "image/jpeg",
           "name": game.name
       })
    });
});

main().then(() => console.log(images));

一旦top-level await proposal lands,您就可以等待main

【讨论】:

  • 但我想await 将结果保存在变量中。在继续下一步之前,我该如何等待回复?我不想移动 then 函数中的其余代码
  • 您的第二个示例由于范围而记录了不同的images
  • @JunaidAnwar 感谢您的编辑建议。实际上,由于本例中的main 函数正在变异images,因此它不需要返回任何内容。我相应地编辑了我的答案。关于您的问题,这取决于如何使用 addGame (main) 函数。你有更多可用的代码吗?
猜你喜欢
  • 2016-10-15
  • 2017-10-13
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2019-10-06
  • 2017-05-22
相关资源
最近更新 更多