Промисҳо дар услуби синхронӣ дар 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();