Ishara za Kuzuia Katika Minyororo ya Ahadi katika JavaScript
Hebu kwa sababu zozote ahadi yetu imalizike kwa hitilafu:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
Katika kesi hii utekelezaji wa kodi utaenda mara moja
kwa then ile, ambayo ina kitendakazi-kichakataji
hitilafu, au kwa catch ya kwanza, inategemea
nini kitakachokutana kwanza.
Hapa kuna mfano wa hali ya kwanza:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// utekelezaji utaenda mara moja hapa
}
).then(
function(result) {
console.log(result);
}
);
Hapa kuna mfano wa hali ya pili:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// utekelezaji utaenda mara moja hapa
}
).then(
function(result) {
console.log(result);
}
);
Kitendakazi-kichakataji kina chaguzi mbili za vitendo:
kikiweza kukabiliana na hali ya ishara,
kinaweza kurudisha matokeo kupitia return
na utekelezaji utaendelea zaidi kwenye mnyororo.
Kama hakiwezi kukabiliana na hitilafu, inaweza
au kurudisha chochote, au kutupa ishara
kupitia throw. Katika kesi hii utekelezaji
utaenda kwa kichakataji hitilafu kinachofuata
(katika then au catch - nini kitakachokutana
kwanza).
Kwa kawaida, hitilafu zote za mnyororo hushikwa
katika sehemu moja: mwisho wa mnyororo huwekwa
catch:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// tutaingia hapa kwa kesi ya hitilafu
}
);
Wakati huo huo ishara inaweza kutokea kwenye
ahadi yenyewe, au kutupwa kupitia throw
katika kiungo chochote cha mnyororo:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (kilaKituSawa) {
return result + '2';
} else {
throw new Error('hitilafu'); // tunaenda kwa kichakataji wa karibu
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// kichakataji wa karibu
}
);
Zingatia, kuwa catch inahitajika hasa kwa
kutambua hitilafu: inawezekana kutatuliwa au la.
Kama hitilafu inaweza kutatuliwa, basi catch inapaswa
kupitisha suluhisho lake kwa then inayofuata.
Na kama haitatuliki (au catch hii
hajui tu jinsi ya kuitatua), basi tunapaswa
kurudisha chochote au kutupa ishara:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (hitilafuInatulika) {
return 'data'; // tunapeleka kwa then inayofuata
} else {
// hurudishi chochote au unatupa ishara
}
}
).then(
function(result) {
// hapa tunatatua hitilafu
}
);