A async
/ await
operátorok megkönnyítik számos aszinkron ígéret végrehajtását. Lehetővé teszik a mérnökök számára, hogy világosabb, tömörebb, tesztelhetőbb kódot írjanak.
Ennek a témának a megértéséhez alaposan meg kell ismernie az ígéretek működését.
Alapszintaktika
function slowlyResolvedPromiseFunc(string) { return new Promise(resolve => { setTimeout(() => { resolve(string); }, 5000); }); } async function doIt() { const myPromise = await slowlyResolvedPromiseFunc("foo"); console.log(myPromise); // "foo" } doIt();
Néhány dolgot érdemes megjegyezni:
- A
await
nyilatkozatot magában foglaló függvénynek tartalmaznia kell azasync
operátort. Ez elmondja a JS tolmácsnak, hogy meg kell várnia, amíg az Ígéret megoldásra kerül vagy elutasításra kerül. - Az
await
operátornak inline-nak kell lennie a const deklaráció során. - Ez
reject
ugyanúgy működik, mintresolve
.
Beágyazott Promises vs. Async
/Await
Egyetlen ígéret végrehajtása meglehetősen egyszerű. Ezzel szemben a Láncolt ígéretek vagy egy függőségi minta létrehozása „spagetti kódot” eredményezhet.
A következő példák feltételezik, hogy a request-promise
könyvtár a következő néven érhető el rp
.
Láncolt / beágyazott ígéretek
// 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
és await
Ígéretek
// 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!'));
A használat előnyei async
és await
egyértelműek. Ez a kód olvashatóbb, modulárisabb és tesztelhetőbb.
Meg kell jegyezni, hogy annak ellenére, hogy van egyidejűleg a párhuzamosság, az alapul szolgáló számítási folyamat megegyezik az előző példával.
A hibák kezelése / elutasítás
Egy alap próbálkozási blokk kezeli az elutasított ígéretet.
async function errorExample() { try { const rejectedPromise = await Promise.reject("Oh-oh!"); } catch (error) { console.log(error); // "Uh-oh!" } } errorExample();