Výnimky v reťazcoch promise v JavaScripte
Nech z akýchkoľvek dôvodov naša promise skončí chybou:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
V takom prípade sa vykonávanie kódu okamžite prenesie
k tomu then, v ktorom je funkcia na spracovanie
chyby, alebo k prvému catch, podľa toho,
čo sa nájde skôr.
Tu je príklad prvej situácie:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// vykonávanie sa okamžite prenesie sem
}
).then(
function(result) {
console.log(result);
}
);
Tu je príklad druhej situácie:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// vykonávanie sa okamžite prenesie sem
}
).then(
function(result) {
console.log(result);
}
);
Funkcia na spracovanie má dve možnosti akcie:
ak sa jej podarilo vyriešiť výnimočnú situáciu,
môže vrátiť výsledok pomocou return
a vykonávanie bude pokračovať ďalej v reťazci.
Ak sa jej nepodarilo chybu vyriešiť, môže
buď nič nevrátiť, alebo vyhodiť výnimku
pomocou throw. V tomto prípade sa vykonávanie
prenesie na ďalší zachytávač chýb
(v then alebo catch - podľa toho, čo sa nachádza
skôr).
Spravidla sú všetky chyby reťazca zachytené
na jednom mieste: na konci reťazca je umiestnený
catch:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// dostaneme sa sem v prípade chyby
}
);
Výnimka môže vzniknúť v samotnej
promise, alebo byť vyhodená pomocou throw
v akomkoľvek článku reťazca:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (vsetkoJeDobre) {
return result + '2';
} else {
throw new Error('chyba'); // prechádzame k najbližšiemu zachytávaču
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// najbližší zachytávač
}
);
Majte na pamäti, že catch je potrebný práve pre
diagnostiku chyby: je riešiteľná alebo nie.
Ak je chyba riešiteľná, catch by mal
odovzdať jej riešenie nasledujúcemu then za sebou.
Ak nie je riešiteľná (alebo daný catch
jednoducho nevie, ako ju vyriešiť), mali by sme
buď nič nevrátiť, alebo vyhodiť výnimku:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (chybaJeRiesitelna) {
return 'data'; // odosielame na ďalší then
} else {
// nič nevraciame alebo vyhadzujeme výnimku
}
}
).then(
function(result) {
// tu riešime chybu
}
);