Պրոմիսները սինխրոն ոճով 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();