Async / afventer og løfter forklaret

De async/ awaitoperatører gør det lettere at gennemføre mange async Promises. De tillader også ingeniører at skrive klarere, mere kortfattet, testbar kode.

For at forstå dette emne skal du have en solid forståelse af, hvordan løfter fungerer.

Grundlæggende syntaks

function slowlyResolvedPromiseFunc(string) { return new Promise(resolve => { setTimeout(() => { resolve(string); }, 5000); }); } async function doIt() { const myPromise = await slowlyResolvedPromiseFunc("foo"); console.log(myPromise); // "foo" } doIt();

Der er et par ting at bemærke:

  • Funktionen, der omfatter awaiterklæringen, skal omfatte asyncoperatøren. Dette vil fortælle JS-tolken, at den skal vente, indtil løftet er løst eller afvist.
  • Den awaitOperatøren skal indbygges, under const erklæring.
  • Dette fungerer rejectså godt som resolve.

Nested Promises vs. Async/Await

Implementering af et enkelt løfte er ret ligetil. I modsætning hertil kan kædede løfter eller oprettelsen af ​​et afhængighedsmønster producere "spaghetti-kode".

Følgende eksempler antager, at request-promisebiblioteket er tilgængeligt som rp.

Lænkede / nestede løfter

// First Promise const fooPromise = rp("//domain.com/foo"); fooPromise.then(resultFoo => { // Must wait for "foo" to resolve console.log(resultFoo); const barPromise = rp("//domain.com/bar"); const bazPromise = rp("//domain.com/baz"); return Promise.all([barPromise, bazPromise]); }).then(resultArr => { // Handle "bar" and "baz" resolutions here console.log(resultArr[0]); console.log(resultArr[1]); });

asyncog awaitløfter

// Wrap everything in an async function async function doItAll() { // Grab data from "foo" endpoint, but wait for resolution console.log(await rp("//domain.com/foo")); // Concurrently kick off the next two async calls, // don't wait for "bar" to kick off "baz" const barPromise = rp("//domain.com/bar"); const bazPromise = rp("//domain.com/baz"); // After both are concurrently kicked off, wait for both const barResponse = await barPromise; const bazResponse = await bazPromise; console.log(barResponse); console.log(bazResponse); } // Finally, invoke the async function doItAll().then(() => console.log('Done!'));

Fordelene ved at bruge asyncog awaitskal være klare. Denne kode er mere læselig, modulær og testbar.

Det er rimeligt at bemærke, at selvom der er en ekstra følelse af samtidighed, er den underliggende beregningsproces den samme som det foregående eksempel.

Håndteringsfejl / afvisning

En grundlæggende prøvefangerblok håndterer et afvist løfte.

async function errorExample() { try { const rejectedPromise = await Promise.reject("Oh-oh!"); } catch (error) { console.log(error); // "Uh-oh!" } } errorExample();