Undtagelser i Promise-kæder i JavaScript
Lad os antage, at vores promise af en eller anden grund slutter med en fejl:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
I dette tilfælde vil kodeudførelsen straks gå videre
til det then, hvor der er en fejlhåndteringsfunktion,
eller til det første catch, afhængigt af hvad der
mødes først.
Her er et eksempel på den første situation:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// udførelsen vil straks gå videre hertil
}
).then(
function(result) {
console.log(result);
}
);
Her er et eksempel på den anden situation:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// udførelsen vil straks gå videre hertil
}
).then(
function(result) {
console.log(result);
}
);
Fejlhåndteringsfunktionen har to handlemuligheder:
hvis den har håndteret undtagelsessituationen,
kan den returnere et resultat via return
og udførelsen fortsætter videre langs kæden.
Hvis den derimod ikke kunne håndtere fejlen, kan den
enten ikke returnere noget eller kaste en undtagelse
via throw. I dette tilfælde vil udførelsen
gå videre til den næste fejlafviser
(i then eller catch - hvad der mødes
først).
Som regel bliver alle fejl i kæden fanget
på ét sted: et catch placeres
i slutningen af kæden:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// vi kommer hertil i tilfælde af en fejl
}
);
Her kan undtagelsen opstå i selve
promiset, eller blive kastet via throw
i ethvert led af kæden:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (altGodt) {
return result + '2';
} else {
throw new Error('fejl'); // går videre til nærmeste afviser
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// nærmeste afviser
}
);
Vær opmærksom på, at catch netop er nødvendig for
fejldiagnosticering: er den løsbar eller ej.
Hvis fejlen er løsbar, skal catch
sende dens løsning videre til det then, der følger efter den.
Og hvis den ikke er løsbar (eller denne catch
simpelthen ikke ved, hvordan man løser den), skal vi
enten ikke returnere noget eller kaste en undtagelse:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (fejlLøsbar) {
return 'data'; // sender vi videre til næste then
} else {
// returnerer ikke noget eller kaster undtagelse
}
}
).then(
function(result) {
// her løser vi fejlen
}
);