Vár minden ígéretet, beleértve a hibákat is
Ha Ön Javascript-fejlesztő, akkor valószínűleg a szabványos beépített Promise objektumot és annak API Promise.all-ját használta, amely addig vár, amíg a tömbben megadott összes ígéret megoldódik. Ez egy nagyon elegáns módja annak, hogy megvárja a különböző aszinkron eredményeket, mielőtt folytatná az üzleti logikáját.
De ez az API nem kezeli a hibákat. Amikor legalább egy hiba történik az ígéretek tömbjében, a függvény azonnal leáll, és nem várnak további eredményeket.
A Promise.allSettled minden aszinkron eredményre vár
Szerencsére elérhető egy második API, a Promise.allSettled, amely garantálja, hogy minden ígéretet kivár, függetlenül attól, hogy az eredmény érvényes vagy hiba. Az alábbi kód bemutatja annak használatát, ami nagyon egyszerű, de sok fejfájástól kímélheti meg.
A fő különbség a Promise.all-hoz képest az, hogy minden ígéret egy sor információra oldódik fel, ahol mind az állapot (teljesült vagy elutasított), mind az érték (teljesítés esetén) vagy az ok (elutasítás esetén) elérhető .
Üres tömb megadása
Egy speciális eset, amellyel tisztában kell lennie, az az, hogy amikor a Promise.allSettled üres tömböt kap bemenetként, azonnal újra feloldódik egy üres tömbbe. Ez logikusan hangzik, és az elvárt viselkedés, de mégis szerettem volna rámutatni.
/**
* A simple dummy function that
* fetches data from multiple
* endpoints related to a user.
*/
async function fetchUserData(id){
// A simple array of promises.
// The first two parameters are
// mock calls from down below.
const promises = [
fetchUserHistory(id),
fetchUserProfile(id),
// For testing only, let's throw.
Promise.reject(new Error('an error'))
];
const values = await Promise.allSettled(promises);
// values === [
// { status: "fulfilled", value: [1, 2, 3] },
// { status: "fulfilled", value: {name:"dummy"} },
// { status: "rejected", reason: {}
// ]
}
// The following functions are just mocks
// and should help improve readability
// of the example at the top.
async function fetchUserHistory(id){
return Promise.resolve([1,2,3]);
}
async function fetchUserProfile(id){
return Promise.resolve({ name: "dummy" });
}
Amint láthatja, a Promise.allSettled nagyon szép kiegészítője a Promise.all-nak, és lehetővé teszi, hogy az összes eredményre várjon, függetlenül azok eredményeitől. Nem hiszem, hogy ez az API minden felhasználási esethez illeszkedik, de biztosan megkíméli az aszinkron hívások egy overhead try-catch-blokkba csomagolásától.