Как уменьшить многократный Promise.all?

Я пытаюсь использовать Promise.all внутри reduce и не могу получить мой function работать, если только в моем массиве нет только одного пользователя. Начальный объект reduce это Promise, Первый раз через reduce, Promise имеет .all доступно на нем. Второй раз через .all не доступен.

return UserQueries.addUsersOnCasefileCreate(input).then(users => {
  return users.reduce((promise, user) => {
    return promise.all([
      AddressQueries.addAddress(user.address, user.userId, input.orgId),
      EmailQueries.addEmail(user.emails, user.userId, input.orgId),
      PhoneQueries.addPhones(user.phones, user.userId, input.orgId)
    ])
    .then(() => Promise.resolve(user))
  }, Promise);
})

Как я мог выполнить эту операцию?

2 ответа

Решение

Вы инициализируете с Promise которая является функцией, хотя и возвращает разрешенную Promise объект, где два не совпадают.

Вы можете инициализировать с Promise.resolve(), вызов promise.then()затем вернитесь Promise.all() с .then() прикованный первым .then(), который проходит Promise возражать против следующей итерации в .reduce(),

return UserQueries.addUsersOnCasefileCreate(input).then(users => {
  return users.reduce((promise, user) => {
    return promise.then(() => Promise.all([
      AddressQueries.addAddress(user.address, user.userId, input.orgId),
      EmailQueries.addEmail(user.emails, user.userId, input.orgId),
      PhoneQueries.addPhones(user.phones, user.userId, input.orgId)
    ]))
    .then(() => user))
  }, Promise.resolve());
})

Там нет необходимости использовать reduce(), Просто нанесите на карту вещи и ждите их всех.

return UserQueries.addUsersOnCasefileCreate(input).then(users => {
  return Promise.all(users.map((user) => {
    return Promise.all([
      AddressQueries.addAddress(user.address, user.userId, input.orgId),
      EmailQueries.addEmail(user.emails, user.userId, input.orgId),
      PhoneQueries.addPhones(user.phones, user.userId, input.orgId)
    ]);
  }));
});
Другие вопросы по тегам