Промисы в синхронном стиле в JavaScript

Для решения проблемы promise hell был придуман специальный синтаксис промисов, позволяющий писать асинхронный код гораздо проще - в синхронном стиле.

Давайте приступим к его изучению. Для начала возьмем код из предыдущего урока:

function func() { getSmth(2).then(res => { console.log(res); // выведет 4 }); } func();

Если бы наша функция getSmth была синхронной, то код функции func мы могли бы переписать следующим образом:

function func() { let res = getSmth(2); console.log(res); // выведет 4 }

Функция getSmth, однако, асинхронная, поэтому приведенный выше код не сработает. Но, воспользовавшись синхронным стилем промисов, мы сможем получить нечто похожее. Сделаем это.

Для начала мы должны объявить нашу функцию func асинхронной с помощью специальной команды async:

async function func() { }

После этого мы сможем внутри функции func использовать специальную команду await. Эта команда, написанная перед промисом, заставит JavaScript ждать до тех пор, пока промис не выполнится. После чего команда вернет результат промиса, и выполнение кода продолжится.

В нашем случае мы должны написать await перед вызовом getSmth. Так как результатом вызова этой функции будет промис, то дальнейшее выполнение кода продолжится только после выполнения этого промиса. Ну, а результат промиса можно записать в переменную. Сделаем описанное:

async function func() { let res = await getSmth(2); console.log(res); // выведет 4 } func();

Давайте вызовем getSmth несколько раз:

async function func() { let res1 = await getSmth(2); let res2 = await getSmth(3); console.log(res1 + res2); // выведет 13 } func();

А теперь будем вызывать getSmth в цикле:

async function func() { let arr = [1, 2, 3, 4, 5]; let sum = 0; for (let elem of arr) { sum += await getSmth(elem); } console.log(sum); } func();

Дан следующий код:

function func() { getSmth(2).then(res1 => { getSmth(3).then(res2 => { getSmth(4).then(res3 => { console.log(res1 + res2 + res3); }); }); }); } func();

Перепишите его через синхронный синтаксис промисов.

Обработка исключительных ситуаций

Синхронный синтаксис промисов поддерживает обработку исключений через обычный try-catch:

async function func() { try { let res = await getSmth(2); console.log(res); } catch (err) { console.log(err); } } func();