AWS SDK S3在更新forEach数组的同时在forEach中调用

时间:2019-02-22 14:38:42

标签: javascript amazon-s3 promise aws-sdk

首先,我使用s3.listObject()方法获取存储桶中的对象列表。这是一个承诺,我将结果发送到另一个函数,在其中我要遍历结果并收集每个对象上的元数据:

  S3.listObjects({
    Bucket: bucketName,
    MaxKeys: 10,
    Marker: marker,
  })
  .promise()
  .then(collectRedirects)
  .then(callback); // each object in my list should now all have a new property, the metatag

在collectRedirects函数内部,我需要遍历传递的结果,然后使用另一个异步函数s3.getObject来获取元标记。像这样:

collectRedirects(objects) {
    objects.forEach(function(e,i,a){
        a[i].foo = S3.getObject({
            Key: e.Key,
            Bucket: bucketName
          })
          .promise()
          .then(function(result){
            Promise.resolve( result.foo );
          });
      }); //end loop
   return objects;
}

但是,在getObject方法解析之前,循环已完成。我下一步是什么?

我试图将getObject方法的结果保存到一个promises数组中,然后运行Promise.all,但这只是给了我一组未定义的值:

var promises = [];
objects.forEach(function(e,i,a){
  let p = S3.getObject({...})
  .promise().then(function(result){ 
    Promise.resolve( result.foo ); 
  });
  promises.push(p);
});
Promise.all(promises)
.then(function(values) {
  console.log(values);
});

我应该怎么做?

1 个答案:

答案 0 :(得分:0)

您的问题是您没有setFragment(new HomeFragment()) return中的任何东西。它只是创建一个承诺,然后丢弃它并返回function(result){ Promise.resolve( result.foo ); }

您正在寻找undefined

一起,你会写

function (result) { return result.foo; }