Async / Await и обещания обяснени

Операторите async/ awaitулесняват изпълнението на много асинхронни обещания. Те също така позволяват на инженерите да пишат по-ясен, по-кратък, проверяем код.

За да разберете тази тема, трябва добре да разберете как работят Обещанията.

Основен синтаксис

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

Има няколко неща, които трябва да се отбележат:

  • Функцията, която обхваща awaitдекларацията, трябва да включва asyncоператора. Това ще каже на интерпретатора на JS, че трябва да изчака, докато Обещанието бъде разрешено или отхвърлено.
  • По awaitвреме на декларацията за const операторът трябва да е вграден.
  • Това работи rejectкакто за resolve.

Вложени обещания срещу Async/Await

Прилагането на едно обещание е доста лесно. За разлика от това, Chained Promises или създаването на модел на зависимост може да създаде „код за спагети“.

Следващите примери предполагат, че request-promiseбиблиотеката е достъпна като rp.

Оковани / вложени обещания

// 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и awaitОбещания

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

Предимствата от използването asyncи awaitтрябва да са ясни. Този код е по-четлив, модулен и проверяем.

Справедливо е да се отбележи, че въпреки че има добавено усещане за съвпадение, основният изчислителен процес е същият като предишния пример.

Обработка на грешки / отхвърляне

Основният блок try-catch обработва отхвърлен Promise.

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