Javascript - Как уменьшить несколько Promise.all?
0 jhamm [2017-04-16 07:16:00]
Я пытаюсь использовать 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);
})
Как я могу выполнить эту операцию?
javascript promise reduce
2 ответа
1 Решение guest271314 [2017-04-16 07:46:00]
Вы инициализируетесь с помощью 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());
})
1 Tatsuyuki Ishi [2017-04-16 07:48:00]
Нет необходимости использовать 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)
]);
}));
});