Javascript - Как уменьшить несколько 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);
})

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

Ответ 1

Вы инициализируетесь с помощью 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());
})

Ответ 2

Нет необходимости использовать 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)
    ]);
  }));
});