Vang foute in Promise.all

'n Veilige alternatief vir Javascript se Promise.all

Wag vir alle beloftes insluitend foute

As jy 'n Javascript-ontwikkelaar is, het jy heel waarskynlik die standaard ingeboude voorwerp Promise en sy API Promise.all gebruik, wat wag totdat alle beloftes wat in 'n skikking verskaf word, opgelos is. Dit is 'n baie elegante manier om verskeie asynchrone resultate te wag voordat u met u besigheidslogika voortgaan.

Maar hierdie API hanteer nie foute nie. Wanneer ten minste een fout in die reeks beloftes voorkom, stop die funksie onmiddellik en word geen verdere resultate gewag nie.

Promise.allSettled wag op alle asynchrone resultate

Gelukkig is daar 'n tweede API genaamd Promise.allSettled beskikbaar wat waarborg om op alle beloftes te wag, maak nie saak of die resultaat geldig is of 'n fout is nie. Die volgende kode demonstreer die gebruik daarvan, wat regtig eenvoudig is, maar jou baie hoofpyn kan bespaar.

Die belangrikste verskil met Promise.all is dat elke belofte opgelos word tot 'n tupel inligting, waar beide die staat (nagekom of verwerp) sowel as die waarde (in geval van nagekom) of die rede (in geval van verwerp) beskikbaar is .

Die verskaffing van 'n leë skikking

'n Spesiale geval waarvan jy bewus moet wees, is dat wanneer Promise.allSettled 'n leë skikking as invoer ontvang, dit onmiddellik na 'n leë skikking oorskakel. Dit klink logies en is die verwagte gedrag, maar ek wou dit tog uitwys.

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

Soos jy kan sien, is Promise.allSettled 'n baie goeie toevoeging tot Promise.all en laat jou toe om op alle resultate te wag, onafhanklik van hul resultate. Ek dink nie dat hierdie API by elke gebruiksgeval sal pas nie, maar dit red jou seker daarvan om asynchrone oproepe in 'n oorhoofse probeer-vang-blok toe te draai.