Async / Await i obećanja objašnjena

U async/ awaitoperateri 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 awaitdeklaraciju mora uključivati asyncoperatora. To će JS tumaču reći da mora pričekati dok se Obećanje ne riješi ili odbije.
  • awaitOperater mora biti u istoj razini, tijekom const deklaracije.
  • Ovo djeluje rejecti za resolve.

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

asynci awaitobeć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 asynci awaittrebale 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();