Как уменьшить многократный 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)
]);
}));
});