javascript - 如何减少倍数 Promise.all?

javascript - How do I reduce multiple Promise.all?

我正在尝试在 reduce 中使用 Promise.all,但我的 function 无法正常工作,除非我的数组中只有一个用户。 reduce 的起始对象是 Promise。第一次通过 reducePromise 上有 .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);
})

如何执行此操作?

您使用 Promise 进行初始化,这是一个函数,尽管 return 是已解析的 Promise 对象,但两者并不相同。

您可以使用 Promise.resolve() 进行初始化,调用 promise.then(),然后 return 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)
    ]);
  }));
});