javascript - 异步/等待的竞争条件

标签 javascript node.js

我遇到了一个问题(竞争条件),我似乎无法克服。

我在下面的 console.log 语句中添加了两条注释。你可以看到第二个首先被调用,这是一个问题,因为那时 var 是空的。我有异步和等待,但仍然不确定为什么会这样

router.put("/", async (req, res, next) => {
   var s3 = new AWS.S3();

  var params = {
    Bucket: "bucket1",
    Delimiter: '/',
    Prefix: req.body.params + '/'
  };

  var files= [];
  var tmp = '';

await s3.listObjectsV2(params, function(err, data) {

  for(var item in data.Contents){
      for(var anotherItem in data.Contents[item]){
        if(anotherItem == "Key"){
          tmp = data.Contents[item][anotherItem]
          var res = tmp.replace(req.body.params + '/', '')
          files.push(res)
        }
      }
   }
   this.allFiles = files
   console.log('allFiles - First', this.allFiles);  //this is logged second and has the correct data array

});

  console.log('allFiles - Second', this.allFiles);  //this gets logged first and is empty
  return res.send(this.allFiles);
});

最佳答案

await 仅适用于 Promises。看起来 listObjectsV2 是基于回调的,而不是基于 Promise 的——你必须明确地将它转换为 Promise 才能 await ,你还不如将 Promise 直接解析为 allFiles:

const allFiles = await new Promise((resolve, reject) => {
  s3.listObjectsV2(params, function(err, data) {
    if (err) reject (err);
    const files = [];
    for(var item in data.Contents){
      for(var anotherItem in data.Contents[item]){
        if(anotherItem == "Key"){
          tmp = data.Contents[item][anotherItem]
          var res = tmp.replace(req.body.params + '/', '')
          files.push(res)
        }
      }
    }
    console.log('allFiles - First', files);
    resolve(files);
  });
});
console.log('allFiles - Second', allFiles);
return res.send(allFiles);

关于javascript - 异步/等待的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830362/

相关文章:

javascript - 为本地 Firefox 调试启用 HTTP 地理定位

javascript - 无法从 Electron 视频聊天应用程序的第二个窗口中打开视频源(第一个窗口可以正常打开视频源)

node.js - 无法将嵌套 json 插入 cassandra

node.js - 如何在express js中将图像文件发布到其他服务器?

javascript - 如何使用 async/await 从 sqlite db.each 获取数据

node.js - AngularJS:Karma + Jasmine 使用 _real_ 后端进行测试

javascript - REST API 的 Web UI

javascript - HTML 空白屏幕

javascript - Jquery加载(): body class not retrieved

javascript - JavaScript 循环中的访问范围