Maybaygiare.org

Blog Network

Fehlerbehandlung in langen Versprechensketten

Das Tao der Versprechen

Mit etwas mehr Erfahrung und Verständnis von Versprechungen und den monadischen Gesetzen, die ihre Verwendung regeln, hätten wir nicht so viel Zeit damit verbracht, am Refactor dieses Codes zu arbeiten.

In JavaScript kann asynchroner Code über Versprechen gehandhabt werden, die die Fortsetzungsmonaden von JavaScript sind. Das Wichtigste in diesem Fall, dass Versprechen eine Monade sind, ist, dass das folgende Gesetz zutrifft:

Promise.resolve(Promise.resolve(x)) === Promise.resolve(x).

Und wichtiger als das obige gilt auch für jeden Wert x:

Promise.resolve(Promise.reject(x)) === Promise.reject(Promise.resolve(x)) === Promise.reject(x).

Diese magische Regel oben hat mir am Ende des Tages etwas Gedankenkraft erspart. Dies bedeutete, dass ich diese Fehler behandeln konnte, sobald sie innerhalb ihrer eigenen Funktionen auftraten, und mich von diesem langkettigen Wahnsinn fernhielt. Die Antwort war immer da und starrte mich an, ich konnte es einfach nicht sehen. Jetzt sehe ich, und es ist wunderschön.

Nun, das ist ein gutes, wahres Versprechen

Dies bedeutete, dass ich einfach die saveApplication Funktion wie folgt haben könnte, zum Beispiel:

function saveApplication() {
return makeApiCall().catch((err) => Promise.reject('basic'));
}

Die .catch block bedeutet, dass wir einen Fehler im Basisschritt des Formulars behandeln, da der Aufruf von saveApplication mit dem Schritt des Formulars namens basic zusammenhängt. Dies führte uns zu dem schönen Stück Code unten:

saveApplication()
.then(uploadImages)
.then(saveService)
.then(savePricingInfo)
.then(savePaymentInfo)
.then(gotoMainPage)
.catch((step) => {
setErrorState();
multiStepManager.go(step);
});

Wir hatten nur eine einzige Zeile der Versprechenskette zu ändern, jetzt, dass alle Funktionen innerhalb der .dann gibt blocks ein Versprechen zurück, das bereits an den entsprechenden Schritt zurückgewiesen wurde.

Aber was ist, wenn andere Arten von Fehlern aufgetreten sind, die nicht von den inneren Fängen behandelt wurden?

Nun, das könnte leicht gelöst werden, indem benutzerdefinierte Fehlertypen implementiert und die Auswertung verschiedener Fehlertypen in unserem main getrennt werden.block fangen. Wie folgt aus:

function saveApplication() {
return makeApiCall().catch((err) => Promise.reject(new StepError('basic')));
}//
saveApplication()
.then(uploadImages)
.then(saveService)
.then(savePricingInfo)
.then(savePaymentInfo)
.then(gotoMainPage)
.catch((step) => {
if(err instanceof StepError) {
setErrorState();
multiStepManager.go(step);
}
else {
// handle other types of errors
}
});

In diesem Fall ist die Haupt .der catch-Block behandelt nur Fehler vom Typ StepError. Andere Arten von Fehlern werden einfach geworfen, nicht abgelehnt, so dass sie von der Anwendung oder dem Browser entsprechend behandelt werden können.

Das gleiche Prinzip kann und sollte erweitert werden, um bestimmte Fehlertypen wie unterschiedliche HTTP-Status zu behandeln.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.