Ü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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage