Premtet në stilin sinkron në JavaScript
Për të zgjidhur problemin e promise hell u shpik një sintaksë e veçantë e premtimeve, e cila lejon shkrimin e kodit asinkron shumë më lehtë - në stilin sinkron.
Le të fillojmë ta studiojmë atë. Për fillim le të marrim kodin nga mësimi i mëparshëm:
function func() {
getSmth(2).then(res => {
console.log(res); // do të shfaqë 4
});
}
func();
Nëse funksioni ynë getSmth do të ishte
sinkron, atëherë kodin e funksionit func ne
do ta rishkruanim si më poshtë:
function func() {
let res = getSmth(2);
console.log(res); // do të shfaqë 4
}
Funksioni getSmth, megjithatë, është asinkron,
prandaj kodi i paraqitur më sipër nuk do të funksionojë.
Por, duke përdorur stilin sinkron të premtimeve,
ne mund të marrim diçka të ngjashme. Le ta bëjmë këtë.
Për fillim ne duhet të deklarojmë funksionin tonë
func si asinkron duke përdorur komandën speciale
async:
async function func() {
}
Pas kësaj, ne do të mundemi brenda funksionit func
të përdorim komandën speciale await.
Kjo komandë, e shkruar para një premtimi, do ta detyrojë
JavaScript-in të presë derisa premtimi
të përmbushet. Pas kësaj, komanda do të kthejë
rezultatin e premtimit, dhe ekzekutimi i kodit do të vazhdojë.
Në rastin tonë, ne duhet të shkruajmë await
përpara thirrjes së getSmth. Meqenëse rezultati
i thirrjes së këtij funksioni do të jetë një premtim, atëherë ekzekutimi
i mëtejshëm i kodit do të vazhdojë vetëm pas
përmbushjes së atij premtimi. Epo, dhe rezultati
i premtimit mund të ruhet në një variabël. Le të bëjmë
atë që u përshkrua:
async function func() {
let res = await getSmth(2);
console.log(res); // do të shfaqë 4
}
func();
Le ta thërrasim getSmth disa herë:
async function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // do të shfaqë 13
}
func();
E tani le ta thërrasim getSmth në një cikël:
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();
Rishkruani kodin e mëposhtëm përmes sintaksës sinkrone:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();