2014-01-21 6 views
53

Dies ist wahrscheinlich eine dumme Frage, aber Mitte Versprechen Kette, wie lehnen Sie ein Versprechen aus dem Inneren einer der dann Funktionen? Beispiel:Wie man ein Versprechen von innen dann Funktion zurückweist

someActionThatReturnsAPromise() 
    .then(function(resource) { 
     return modifyResource(resource) 
    }) 
    .then(function(modifiedResource) { 
     if (!isValid(modifiedResource)) { 
      var validationError = getValidationError(modifiedResource); 
      // fail promise with validationError 
     } 
    }) 
    .catch(function() { 
     // oh noes 
    }); 

Es gibt keinen Verweis mehr auf die ursprüngliche Auflösungs-/Ablehnungsfunktion oder den PromiseResolver. Soll ich nur hinzufügen?

+1

eine Ausnahme auslösen? – thefourtheye

+1

'throw validationError' – kavun

Antwort

62

Soll ich nur hinzufügen?

Ja. Allerdings it's that complicated nur in jQuery, mit einer Promise/A+ -kompatiblen Bibliothek auch Sie könnten einfach

throw validationError; 

So würde Ihr Code dann aussehen

someActionThatReturnsAPromise() 
    .then(modifyResource) 
    .then(function(modifiedResource) { 
     if (!isValid(modifiedResource)) 
      throw getValidationError(modifiedResource); 
     // else ! 
     return modifiedResource; 
    }) 
    .catch(function() { 
     // oh noes 
    }); 
+0

Ist das eine regelmäßige Sache zu tun? Ist es weit verbreitet? Es tut mir leid, es zu tun, denn wenn irgendwo im Code ".catch" fehlt, wird die ** ganze ** App mit nicht behaftetem Fehler explodieren. –

+2

Beachten Sie, dass in einer Promise/A + kompatiblen Bibliothek throw verwendet werden kann, weil die 'handler' für' then' ist sync und die Ausnahme kann eingefangen werden. Wenn der Handler async ist, muss er ein Versprechen zurückgeben, um ihn schließlich abzulehnen. Also macht es immer Sinn, Promise.reject() zurückzugeben, anstatt zu werfen. Wenn Sie einen Async-Handler einwerfen, kann die Bibliothek sie nicht abfangen, und sie wird automatisch übergeben. In acht nehmen. –

+1

@MikeGleasonjrCouturier: Es sollte keine asynchronen Handler geben, die nicht '.then' Handler auf ein Versprechen sind :-) Wenn Sie eine nicht promiziierte API verwenden, dann hilft Ihnen sogar' return Promise.reject() '. – Bergi