У меня есть coffeescript, в котором я хочу добавить к объекту 100 юридических удержаний.

Чтобы добавить его, я делаю следующее:

  .then (data) =>
      s3.addLegalHold({
        Bucket: bucketName,
        Key: 'foo',
        RetentionLegalHoldId: 'holdid'
      }).promise()

Чтобы добавить 100, я попробовал это, но это не сработало:

  .then (data) =>
    for i in [0 .. 99]
      console.log('count: ' + i)
      s3.addLegalHold({
        Bucket: bucketName,
        Key: 'foo',
        RetentionLegalHoldId: 'holdid' + i
      }).promise()

У меня console.log('count: ' + i) до 99, но после завершения теста я могу увидеть только одно юридическое удержание. Я думаю, это как-то связано с обещанием, но я не уверен. Как мне это сделать?

0
runnerpaul 19 Сен 2018 в 10:38

2 ответа

Лучший ответ

Попробуй это:

.then (data) =>
  promises = []
  for i in [0 .. 99]
    promises.push(s3.addLegalHold({
      Bucket: bucketName,
      Key: 'foo',
      RetentionLegalHoldId: 'holdid' + i
    }).promise())
  return Promise.all(promises)

Ключевое отличие: Promise.all (MDN ) . Он принимает массив обещаний (в вашем случае 100 обещаний), ждет, пока все они разрешатся, а затем разрешается сам.

1
Roamer-1888 19 Сен 2018 в 12:29

Вы захотите использовать Promise.all в массиве обещаний, которые оценивает ваш цикл:

  .then (data) =>
    Promise.all( for i in [0 ... 100]
      console.log ('count: ' + i)
      s3.addLegalHold {
        Bucket: bucketName,
        Key: 'foo',
        RetentionLegalHoldId: 'holdid' + i
      }
      .promise() )

Это даст вам обещание получить массив результатов.

2
Bergi 19 Сен 2018 в 11:38