Unntak i promise-kjeder i JavaScript
La oss si at vårt promise av en eller annen grunn avsluttes med en feil:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
I dette tilfellet vil kjøringen umiddelbart gå
til den then som har en feilbehandlingsfunksjon,
eller til den første catch, avhengig av
hva som kommer først.
Her er et eksempel på den første situasjonen:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// kjøringen vil umiddelbart gå hit
}
).then(
function(result) {
console.log(result);
}
);
Her er et eksempel på den andre situasjonen:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// kjøringen vil umiddelbart gå hit
}
).then(
function(result) {
console.log(result);
}
);
Feilbehandlingsfunksjonen har to handlemåter:
hvis den taklet unntakssituasjonen,
kan den returnere et resultat via return
og kjøringen vil fortsette videre langs kjeden.
Hvis den derimot ikke taklet feilen, kan den
enten ikke returnere noe, eller kaste et unntak
via throw. I dette tilfellet vil kjøringen
gå til neste feilfanger
(i then eller catch - avhengig av
hva som kommer først).
Som regel fanges alle feil i kjeden
på ett sted: en catch plasseres
på slutten av kjeden:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// vi kommer hit ved en feil
}
);
Unntaket kan oppstå i selve
promise, eller kastes via throw
i et hvilket som helst ledd i kjeden:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (altBra) {
return result + '2';
} else {
throw new Error('feil'); // går til nærmeste feilfanger
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// nærmeste feilfanger
}
);
Husk at catch trengs nettopp for
å diagnostisere feilen: er den løsbar eller ikke.
Hvis feilen er løsbar, bør catch
sende løsningen videre til then etter seg.
Og hvis den ikke er løsbar (eller denne catch
rett og slett ikke vet hvordan den skal løses), bør vi
enten ikke returnere noe eller kaste et unntak:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (feilLøsbar) {
return 'data'; // sender til neste then
} else {
// returnerer ingenting eller kaster unntak
}
}
).then(
function(result) {
// her løser vi feilen
}
);