Промисы в синхронном стиле в 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();