Fogja meg a hibákat a Promise.all-ban

A Javascript Promise.all biztonságos alternatívája

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.