Asünkroon / oota ja lubadused on selgitatud
async
/ await
Operaatorid 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
await
peab sisaldamaasync
operaatorit. See ütleb JS-i tõlgile, et ta peab ootama, kuni lubadus on lahendatud või tagasi lükatud. await
Operaator peab olema inline ajal const deklaratsiooni.- See töötab
reject
niiresolve
.
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-promise
raamatukogu 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]); });
async
ja await
lubadused
// 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 async
ja need await
peaksid 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();