0
votes

I am trying to use a Promise.all inside of a reduce and cannot get my function to work, unless there is only one user in my array. The starting object of the reduce is a Promise. The first time through the reduce, the Promise has .all available on it. The second time through, the .all is not available.

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);
})

How could I perform this operation?

2
There's an obvious case typo between promise and Promise, anyway.Tatsuyuki Ishi
The promise that is lower case is just the first argument of the reduce referring to the Promise as the initial object. It isn't a typo.jhamm
There is no Promise.prototype.all(). Only Promise.all().Tatsuyuki Ishi
The promise from the first argument is the Promise in the initial object. That is why it works the first time through the loop. That is why Promise.all is available at first.jhamm
I doubt it. You're calling a nonexistent function.Tatsuyuki Ishi

2 Answers

2
votes

You initialize with Promise which is a function, though return a resolved Promise object, where the two are not the same.

You can initialize with Promise.resolve(), call promise.then(), then return Promise.all() with .then() chained within first .then(), which passes Promise object to next iteration at .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
votes

There's no need to use reduce(). Just map the things and wait them all.

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)
    ]);
  }));
});