Цепочка обещаний - это концепция, которая последовательно выполняет последовательность асинхронных задач. Разработчик может контролировать каждый блок Promise и предпринимать действия для следующей последовательности выполнения Promise.
С Promise.all
, Promise.race
и Promise.allSettled
вы получаете контроль над выполнением всех сработавших обещаний.
Преимущество: Параллельно запускайте все асинхронные задачи и экономьте время.
Помните: Promise.all
вернет только первое отклонение несмотря на то, что в ваших AJAX вызовах может быть более одного отклонения & Promise.race
вернет результат отклоненного или выполненного обещания, которое произойдет раньше.
Realtime UseCase: ( Нет цепочки ) с использованием Promise.allSettled
В реальном мире благоразумно, что все fetch
вызовы будут выполнены одновременно и разрешено / отклонено статус известен в будущем. В этом случае имеет смысл знать, что все вызовы fetch
пройдены или не выполнены, и предпринять корректирующие действия только для тех, которые требуют внимания к состоянию. Таким образом сохраняются сетевые обходы!
Пример ниже для Promise.allSettled
& Promise.all
, чтобы показать разницу. (Прочитайте комментарии к коду)
const dummy = [{ //Dummy data
value: 1,
delay: 100,
reject: true, //flag to explicitly reject this data
},{
value: 2,
delay: 200
},
{
value: 3,
delay: 300,
},
{
value: 4,
delay: 400,
reject:true
}];
const fakeFetch = function(req){ // Fake fetch call
return new Promise(function(resolve, reject) {
console.log("API:", req.value);
setTimeout(req.reject ? reject : resolve, req.delay, req.value);
})
}
const promiserSettled = async ()=>{
let collate = [];
for(let req of dummy){
collate.push(fakeFetch(req));
}
try{ // Promise.allSettle code block
const everthing = await Promise.allSettled(collate).then((values)=>{
throw values.filter((val) => val.status === "rejected");
})
console.log("Are we done: ", everthing);
}catch(e){
console.log("Promise.allSettled - Rejected Value:", e); // Logs all rejected data
}
try{ // Promise.all code block
const everthing = await Promise.all(collate);
console.log("Are we done: ", everthing);
}catch(e){
console.log("Promise.all - Rejected Value:", e); // Logs only one rejected data
}
};
promiserSettled(); // Execute main