AWS SDK S3 вызывает внутри forEach при обновлении массива forEach - PullRequest
0 голосов
/ 22 февраля 2019

Сначала я использую метод 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 в массиве обещаний, а затем запустил 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 голосов
/ 23 февраля 2019

Ваша проблема в том, что вы не return что-либо из function(result){ Promise.resolve( result.foo ); }.Он просто создает обещание, затем отбрасывает его и возвращает 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;
  });
}
...