JavaScript-daği promise hell meselesi
Siz eýýäm bilýärsiňiz, ýüz tutmalaryň (promisleriň) dörediliş maksady callback hell meselesini çözmekdi. Şondan soň bolsa, promisler hem özara çylşyrymly koda getirip bilýändigi anyklandy. Bu meselä meňzeşlikde promise hell diýlip atlandyryldy.
Geliň bu meseläni kodyň mysallary esasynda seredeliň. Bizde getSmth funksiýasy bolsun, ol parametr alyp, şol parametre bagly netije gaýtaryp berse:
function getSmth(num) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num * num), 1000)
});
}
Bu ýagdaýda biz käbir peýdaly amaly (meselem, serwerden maglumat alyp gelmegi) meňzedýäris. Meňzetmek üçin biz diňe san parametri geçirýäris we bir sekuntdan soň şol sanyň kwadratyny gaýtaryp beryäris.
Indi bolsa getSmth funksiýamyzdy beýleki bir funksiýanyň içinde ulanayly:
function func() {
getSmth(2).then(res => {
console.log(res); // 4 çykyar
});
}
func();
Birkinji meselä
Biri-birini yzarlaýan köp mukdarda then gurluşlary kody düşünmegi kynlaşdyrýar:
function func(){
getSmth(2).then(res1 => {
// bir zat edýäris
}).then(res2 => {
// bir zat edýäris
}).then(res3 => {
// bir zat edýäris
}).then(res4 => {
// bir zat edýäris
}).then(res5 => {
// bir zat edýäris
}).then(res6 => {
// bir zat edýäris
});
}
func();
Ikinji meselä
Başga görnüşde meselä hem bar. Indi bolsa funksiýamyzdy iki gezek ulanmak, soňra netijeleri jemlemek isleýäliň. Netijede biz şeýle bir kod alyarys:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
console.log(res1 + res2); // 13 çykyar
});
});
}
func();
Eýýäm, callback hell-e meňzeýär, dogrymy? Ýene bir funksiýa çakylyşy goşalyň - kod hasam erbetleşer:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();
Elbetde, Promise.all ulanmak mümkin:
function func() {
Promise.all([getSmth(2), getSmth(3), getSmth(4)]).then(res => {
console.log(res[0] + res[1] + res[2]);
});
}
func();
Şondan soň, şol bir zady aldymy? Ýok! Birkinji ýagda her täze funksiýa öňki promisiň gutaryşyna garaşýar, ikinji ýagda bolsa - ähli promisler bir wagtda ýerine ýetirilýär. Bu tapawut, indiki funksiýa öňki çakylyşyň netijesini geçirmek islänimizde zerurly bolar:
function func() {
getSmth(2).then(res1 => {
getSmth(res1).then(res2 => {
getSmth(res2).then(res3 => {
console.log(res3);
});
});
});
}
func();