Überspringen der Versprechenskette nach Fehlerbehandlung
Verwendung derhttps://github.com/kriskowal/q Bibliothek, ich frage mich, ob es möglich ist, so etwas zu tun:
// Module A
function moduleA_exportedFunction() {
return promiseReturningService().then(function(serviceResults) {
if (serviceResults.areGood) {
// We can continue with the rest of the promise chain
}
else {
performVerySpecificErrorHandling();
// We want to skip the rest of the promise chain
}
});
}
// Module B
moduleA_exportedFunction()
.then(moduleB_function)
.then(moduleB_anotherFunction)
.fail(function(reason) {
// Handle the reason in a general way which is ok for module B functions
})
.done()
;
Grundsätzlich, wenn die Service-Ergebnisse schlecht sind, möchte ich den Fehler in Modul A mit einer Logik behandeln, die spezifisch für die Interna von Modul A ist, aber die verbleibenden Funktionen von Modul B in der Versprechen-Kette überspringen.
Die naheliegende Lösung für das Überspringen von Modul-B-Funktionen besteht darin, einen Fehler / Grund aus Modul A zu werfen. Dann müsste ich dies jedoch in Modul B erledigen. Idealerweise möchte ich dies tun, ohne zusätzlichen Code in Modul B zu benötigen Das.
Was sehr wohl unmöglich sein kann :) Oder gegen einige Gestaltungsprinzipien von Q.
In welchem Fall würden Sie Alternativen vorschlagen?
Ich habe zwei Ansätze im Sinn, aber beide haben ihre Nachteile:
Wirf einen bestimmten Fehler aus Modul A aus und füge Modul B einen bestimmten Code hinzu:
.fail(function(reason) {
if (reason is specificError) {
performVerySpecificErrorHandling();
}
else {
// Handle the reason in a general way which is ok for module B functions
}
})
Führen Sie die benutzerdefinierte Fehlerbehandlung in Modul A durch und werfen Sie nach der Fehlerbehandlung einen falschen Ablehnungsgrund. Fügen Sie in Modul B eine Bedingung hinzu, um den falschen Grund zu ignorieren:
.fail(function(reason) {
if (reason is fakeReason) {
// Skip handling
}
else {
// Handle the reason in a general way which is ok for module B functions
}
})
Lösung 1 erfordert das Hinzufügen von Modul A-spezifischem Code zu Modul B.
Lösung 2 löst dieses Problem, aber der gesamte Ansatz der falschen Zurückweisung scheint sehr hackisch zu sein.
Können Sie andere Lösungen empfehlen?