Uitsonderings in belofteskakels in JavaScript
Laat om een of ander rede ons belofte met 'n fout eindig:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
In hierdie geval sal die uitvoering van die kode dadelik oorgaan
na die then waar daar 'n fouthandler-funksie is,
of na die eerste catch, afhangende van
wat eerste teëgekom word.
Hier is 'n voorbeeld van die eerste situasie:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// uitvoering sal dadelik hierheen oorgaan
}
).then(
function(result) {
console.log(result);
}
);
Hier is 'n voorbeeld van die tweede situasie:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// uitvoering sal dadelik hierheen oorgaan
}
).then(
function(result) {
console.log(result);
}
);
Die fouthandler-funksie het twee moontlikhede:
as dit die uitsonderlike situasie hanteer het,
kan dit 'n resultaat terugstuur met return
en die uitvoering sal voortgaan in die ketting.
As dit nie die fout kon hanteer nie, kan dit
óf niks terugstuur nie, óf 'n uitsondering gooi
met throw. In hierdie geval sal die uitvoering
oorgaan na die volgende foutonderskepper
(in then of catch - wat eerste teëgekom word).
Gewoonlik word alle foute in die ketting op een plek onderskep:
'n catch word aan die einde van die ketting geplaas:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// ons sal hier uitkom in die geval van 'n fout
}
);
Die uitsondering kan in die belofte self ontstaan,
of gegooi word met throw
in enige skakel van die ketting:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (allesGoed) {
return result + '2';
} else {
throw new Error('fout'); // gaan na naaste onderskepper
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// naaste onderskepper
}
);
Let op dat catch spesifiek nodig is vir
die diagnose van die fout: is dit oplosbaar of nie.
As die fout oplosbaar is, moet die catch
die oplossing daarvoor oordra aan die then wat daarna volg.
As dit nie oplosbaar is nie (of hierdie spesifieke catch
weet eenvoudig nie hoe om dit op te los nie), moet ons
óf niks terugstuur nie óf 'n uitsondering gooi:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (foutOplosbaar) {
return 'data'; // stuur na die volgende then
} else {
// stuur niks terug nie of gooi 'n uitsondering
}
}
).then(
function(result) {
// los hier die fout op
}
);