Ausnahmen in Promise-Ketten in JavaScript
Nehmen wir an, aus irgendeinem Grund wird unser Promise mit einem Fehler abgeschlossen:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
In diesem Fall springt die Ausführung sofort
zu dem then, in dem es einen Fehlerbehandlungs-Handler gibt,
oder zum ersten catch, je nachdem,
was zuerst auftritt.
Hier ist ein Beispiel für die erste Situation:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// Ausführung springt sofort hierher
}
).then(
function(result) {
console.log(result);
}
);
Hier ist ein Beispiel für die zweite Situation:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// Ausführung springt sofort hierher
}
).then(
function(result) {
console.log(result);
}
);
Der Handler-Funktion stehen zwei Aktionsmöglichkeiten zur Verfügung:
Wenn sie die Ausnahmesituation bewältigt hat,
kann sie ein Ergebnis via return zurückgeben
und die Ausführung wird in der Kette fortgesetzt.
Wenn sie den Fehler nicht bewältigen konnte, kann sie
entweder nichts zurückgeben oder eine Ausnahme via
throw werfen. In diesem Fall springt die Ausführung
zum nächsten Fehler-Handler
(in then oder catch - je nachdem, was zuerst
auftritt).
In der Regel werden alle Fehler der Kette an
einer Stelle abgefangen:
Am Ende der Kette wird ein
catch platziert:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// wir landen hier im Fehlerfall
}
);
Dabei kann die Ausnahme im Promise selbst
auftreten, oder via throw
in einem beliebigen Glied der Kette geworfen werden:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (allesGut) {
return result + '2';
} else {
throw new Error('Fehler'); // springen zum nächsten Handler
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// nächster Handler
}
);
Beachten Sie, dass catch genau für die
Fehlerdiagnose benötigt wird: Ist der Fehler lösbar oder nicht?
Wenn der Fehler lösbar ist, muss catch
seine Lösung an den nachfolgenden then weitergeben.
Wenn er nicht lösbar ist (oder dieser catch
einfach nicht weiß, wie er zu lösen ist), dann müssen wir
entweder nichts zurückgeben oder eine Ausnahme werfen:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (fehlerLoesbar) {
return 'Daten'; // senden an den nächsten then
} else {
// nichts zurückgeben oder Ausnahme werfen
}
}
).then(
function(result) {
// hier wird der Fehler gelöst
}
);