Если вы хотите разделить список / массив на основе предиката (в данном случае, будет ли Обещание разрешено или отклонено), используйте partition
!
const partitionP = coll => {
const resolved = [];
const rejected = [];
return Promise.all(coll.map(p => {
p.then(result => resolved.push(result)).catch(err => rejected.push(err));
}).then(_ => [resolved, rejected]);
});
async getApiResults = workersOnMissions => {
const [results, errors] = await partitionP(workersOnMissions.map(workerOnMission => {
return apiService.put('missions', formatWorkerOnMission(workerOnMission));
}));
// do something with the results/errors or just return them
};
Здесь вам нужен раздел с поддержкой Promise, потому что Promise.all
немедленно отклонит, если какое-либо из Promises в массиве отклонится, что означает, что вам нужно вручную управлять итерацией (в этом случае, убедившись, что .catch
любой отказы и вернуть их на счастливый путь). В противном случае вы можете сделать что-то более простое, например, отобразить вызов API для получения массива Promises, а затем разделить результат в обработчике .then
.