Izjeme v verigah promisov v JavaScript
Recimo, da se iz kakršnega koli razloga naš promise konča z napako:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
V tem primeru bo izvajanje koda takoj prešlo
k tistemu then, ki vsebuje funkcijo za obdelavo
napake, ali k prvemu catch, odvisno
kateri se pojavi prej.
Tukaj je primer prve situacije:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// izvajanje bo takoj prešlo sem
}
).then(
function(result) {
console.log(result);
}
);
Tukaj je primer druge situacije:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// izvajanje bo takoj prešlo sem
}
).then(
function(result) {
console.log(result);
}
);
Funkcija za obdelavo ima dve možnosti ukrepanja:
če je uspešno obvladala izjemno situacijo,
lahko vrne rezultat z return
in izvajanje se bo nadaljevalo naprej po verigi.
Če pa ni uspela obvladati napake, lahko
ali ne vrne ničesar, ali vrže izjemo
z throw. V tem primeru bo izvajanje
prešlo na naslednji prestreznik napak
(v then ali catch - karkoli se pojavi
prej).
Praviloma so vse napake verige prestrežene
na enem mestu: na koncu verige se nahaja
catch:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// pridemo sem v primeru napake
}
);
Poleg tega se lahko izjema pojavi v samem
promisu ali pa je vržena z throw
v katerem koli členu verige:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (vseJeVRedu) {
return result + '2';
} else {
throw new Error('napaka'); // prehodimo na najbližji prestreznik
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// najbližji prestreznik
}
);
Upoštevajte, da je catch potreben ravno za
diagnosticiranje napake: ali je rešljiva ali ne.
Če je napaka rešljiva, mora catch
njeno rešitev posredovati naslednjemu then za seboj.
Če pa ni rešljiva (ali ta catch
preprosto ne ve, kako jo rešiti), potem moramo
ali nič vrniti ali vreči izjemo:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (napakaJeResljiva) {
return 'podatki'; // pošljemo na naslednji then
} else {
// nič ne vrnemo ali vržemo izjemo
}
}
).then(
function(result) {
// tukaj rešimo napako
}
);