АКЦЫЯ: бясплатныя месячныя курсы па стварэнні сайтаў
на выбар: вёрстка, JavaScript, PHP, Python або фрэймворкі. Сёння апошні дзень для запісу! Націскай!
⊗jsSpPrmSS 174 of 294 menu

Промісы ў сінхронным стылі ў 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();
byenru