U async
/ await
operateri bi se lakše provesti mnoge Async obećanja. Oni također omogućuju inženjerima da napišu jasniji, sažetiji i provjerljivi kod.
Da biste razumjeli ovu temu, trebali biste dobro razumjeti kako funkcioniraju Obećanja.
Osnovna sintaksa
function slowlyResolvedPromiseFunc(string) { return new Promise(resolve => { setTimeout(() => { resolve(string); }, 5000); }); } async function doIt() { const myPromise = await slowlyResolvedPromiseFunc("foo"); console.log(myPromise); // "foo" } doIt();
Treba napomenuti nekoliko stvari:
- Funkcija koja obuhvaća
await
deklaraciju mora uključivatiasync
operatora. To će JS tumaču reći da mora pričekati dok se Obećanje ne riješi ili odbije. await
Operater mora biti u istoj razini, tijekom const deklaracije.- Ovo djeluje
reject
i zaresolve
.
Ugniježđena obećanja u odnosu na Async
/Await
Provedba jednog Promise prilično je jednostavna. Suprotno tome, lančana obećanja ili stvaranje uzorka ovisnosti mogu proizvesti "špageti kod".
Sljedeći primjeri pretpostavljaju da je request-promise
knjižnica dostupna kao rp
.
Lančana / ugniježđena obećanja
// 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
i await
obećanja
// 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!'));
Prednosti upotrebe async
i await
trebale bi biti jasne. Ovaj je kod čitljiviji, modularniji i provjerljiviji.
Pošteno je primijetiti da iako postoji dodatni osjećaj podudarnosti, temeljni proces izračuna je isti kao i prethodni primjer.
Rukovanje pogreškama / odbijanje
Osnovni blok try-catch obrađuje odbijeno obećanje.
async function errorExample() { try { const rejectedPromise = await Promise.reject("Oh-oh!"); } catch (error) { console.log(error); // "Uh-oh!" } } errorExample();