Promise.all () рассматривает любое возвращенное значение не обещания как разрешенное обещание.
Конечно, но когда вы делаете
return Promise.reject(err);
, вы возвращая Обещание, поэтому, как только он будет развернут вызывающим абонентом, вызов getAndCheckItem
приведет к отклонению Обещания. Выполнение return Promise.reject(err)
очень похоже на выполнение throw err
внутри чего-то async
.
Если все, что вы делаете в catch
, это повторно бросить или вернуть отклоненное Обещание, в этом нет особого смысла - Вы также можете полностью оставить эту часть и просто позволить вызывающей стороне обработать ее:
const getAndCheckItem = async (itemId) => {
const item = await getItem(itemId);
if(item.firstFail) {
throw "First fail";
}
if(item.secondFail) {
throw "Second fail";
}
if(notGood(item)) {
throw "Third fail";
}
return item;
}
В настоящее время вы также передаете массив массивов Обещаний Promise.all
:
await Promise.all([ids.map(value => getAndCheckItem(value))]);
В этом случае Promise.all
ничего не сделает, поскольку единственным элементом его массива является не-Promise (другой массив). Если какое-либо из внутренних обещаний будет отклонено, они не будут обработаны, поэтому вы получите необработанное отклонение.
Вместо этого передайте массив Обещаний Promise.all
:
await Promise.all(ids.map(value => getAndCheckItem(value)));
Или, более кратко:
await Promise.all(ids.map(getAndCheckItem));