javascript - 更新 forEach 数组时,AWS SDK S3 在 forEach 内调用

标签 javascript amazon-s3 promise aws-sdk

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

  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 方法的结果保存到一个 promise 数组中,然后运行 ​​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);
});

我应该怎么做?

最佳答案

你的问题是你没有从 function(result){ Promise.resolve( result.foo ); 中返回任何东西}。它只是创建一个 promise ,然后将其删除并返回 undefined

您正在寻找 function (result) { return result.foo;

总而言之,你会写

collectRedirects(objects) {
  var promises = objects.map(function(e){
    return S3.getObject({
      Key: e.Key,
      Bucket: bucketName
    }).promise().then(function(result){
      return result.foo;
      // or alternatively (if you want to amend the original object)
      e.foo = result.foo;
      return e;
    });
  });
  return Promise.all(promises).then(function(values) {
    console.log(values);
    return values;
  });
}

关于javascript - 更新 forEach 数组时,AWS SDK S3 在 forEach 内调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54829456/

相关文章:

javascript - 在javascript中将字符串编码为utf-16到base64

amazon-web-services - AWS Glue Crawler 创建分区和文件表

node.js - 在循环内创建模型上的 Sequelize 嵌套 promise

javascript - 正确使用 Promise.resolve().then() 错误 : Uncaught (in promise): TypeError: Cannot read property

javascript - 无法在不刷新页面的情况下设置 jquery dialog.InnerHtml(some-content)

javascript - JavaScript 中的 parseInt 函数

javascript - 数据库查询的结果未显示在我的页面上

java - 修改 Activity 的 AWS 联合用户策略/联合 token (AWSJavaSDK)

amazon-web-services - 如何创建 S3 对象的私有(private)可下载链接

javascript - jQuery 递归 AJAX 调用 promise