Kaptu erarojn en Promise.all

Sekura alternativo al Javascript's Promise.all

Atendante ĉiujn promesojn inkluzive de eraroj

Se vi estas Javascript-programisto, vi plej verŝajne uzis la norman enkonstruitan objekton Promise kaj ĝian API Promise.all, kiu atendas ĝis ĉiuj promesoj provizitaj en tabelo solviĝos. Ĉi tio estas tre eleganta maniero atendi diversajn nesinkronajn rezultojn antaŭ ol daŭrigi kun via komerca logiko.

Sed ĉi tiu API ne traktas erarojn. Kiam ajn almenaŭ unu eraro okazas en la tabelo de promesoj, la funkcio tuj ĉesas kaj neniuj pluaj rezultoj estas atendataj.

Promise.allSettled atendas ĉiujn nesinkronajn rezultojn

Feliĉe estas disponebla dua API nomata Promise.allSettled, kiu garantias atendi ĉiujn promesojn, negrave ĉu la rezulto estas valida aŭ eraro. La sekva kodo montras ĝian uzadon, kiu estas vere simpla, sed povas ŝpari al vi multe da kapdoloro.

La ĉefa diferenco al Promise.all estas, ke ĉiu promeso estas solvita al opo de informoj, kie kaj la stato (plenumita aŭ malakceptita) kaj ankaŭ la valoro (en kazo de plenumita) aŭ la kialo (kaze de malakceptita) estas disponeblaj. .

Provizante malplenan tabelon

Speciala kazo, pri kiu vi devus konscii, estas, ke kiam Promise.allSettled ricevas malplenan tabelon kiel enigaĵon, ĝi tuj resoviĝas al malplena tabelo. Ĉi tio sonas logika kaj estas la atendata konduto, sed mi ankoraŭ volis atentigi ĝin.

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

Kiel vi povas vidi, Promise.allSettled estas tre bela aldono al Promise.all kaj permesas vin atendi ĉiujn rezultojn, sendepende de iliaj rezultoj. Mi ne pensas, ke ĉi tiu API taŭgas por ĉiu uzokazo, sed ĝi certe savas vin de envolvi nesinkronajn alvokojn en supra try-catch-bloko.