Rileva gli errori in Promise.all

Un'alternativa sicura a Promise.all di Javascript

In attesa di tutte le promesse compresi gli errori

Se sei uno sviluppatore Javascript, molto probabilmente hai utilizzato l'oggetto standard integrato Promise e la sua API Promise.all, che attende fino a quando tutte le promesse fornite in un array non sono state risolte. Questo è un modo molto elegante per attendere vari risultati asincroni prima di procedere con la logica aziendale.

Ma questa API non gestisce gli errori. Ogni volta che si verifica almeno un errore nell'array di promesse, la funzione si interrompe immediatamente e non sono attesi ulteriori risultati.

Promise.allSettled attende tutti i risultati asincroni

Fortunatamente è disponibile una seconda API chiamata Promise.allSettled che garantisce di attendere tutte le promesse, indipendentemente dal fatto che il risultato sia valido o un errore. Il codice seguente ne dimostra l'utilizzo, che è davvero semplice, ma può farti risparmiare un sacco di mal di testa.

La differenza principale rispetto a Promise.all è che ogni promessa viene risolta in una tupla di informazioni, in cui sono disponibili sia lo stato (adempiuto o rifiutato), sia il valore (in caso di adempimento) o il motivo (in caso di rifiuto). .

Fornire un array vuoto

Un caso speciale di cui dovresti essere a conoscenza è che quando Promise.allSettled riceve un array vuoto come input, si risolve immediatamente in un array vuoto. Sembra logico ed è il comportamento previsto, ma volevo comunque sottolinearlo.

/**
 * 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" });
}

Come puoi vedere, Promise.allSettled è un'aggiunta molto interessante a Promise.all e ti consente di attendere tutti i risultati, indipendentemente dai loro risultati. Non credo che questa API si adatti a tutti i casi d'uso, ma sicuramente ti salva dall'incapsulare le chiamate asincrone in un blocco try-catch overhead.