Asünkroon / oota ja lubadused on selgitatud

async/ awaitOperaatorid oleks lihtsam rakendada paljude async lubadusi. Need võimaldavad inseneridel kirjutada ka selgemat, lühemat ja testitavat koodi.

Selle teema mõistmiseks peaksite olema kindel arusaam lubaduste toimimisest.

Põhisüntaks

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

Pange tähele mõnda asja:

  • Deklaratsiooni hõlmav funktsioon awaitpeab sisaldama asyncoperaatorit. See ütleb JS-i tõlgile, et ta peab ootama, kuni lubadus on lahendatud või tagasi lükatud.
  • awaitOperaator peab olema inline ajal const deklaratsiooni.
  • See töötab rejectnii resolve.

Pesastatud Lubadused vs Async/Await

Ühe lubaduse rakendamine on üsna lihtne. Seevastu aheldatud lubadused või sõltuvusmustri loomine võivad luua spagetikoodi.

Järgmistes näidetes eeldatakse, et request-promiseraamatukogu on saadaval kui rp.

Aheldatud / pesastatud lubadused

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

asyncja awaitlubadused

// 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!'));

Kasutamise eelised asyncja need awaitpeaksid olema selged. See kood on loetavam, modulaarsem ja testitavam.

On õiglane märkida, et kuigi on olemas ka samaaegsuse tunne, on aluseks olev arvutusprotsess sama, mis eelmises näites.

Vigade käitlemine / tagasilükkamine

Põhiline proovimise püüdmise plokk tegeleb tagasilükatud lubadusega.

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