2016-09-25 3 views
2

Ziemlich neu zu Versprechungen hier, und ich frage mich ..Wie kann ich ein Versprechen ablehnen, das ich nicht erstellt habe?

Nach einem Blick auf bluebird Paket für den Umgang mit Versprechen unter:

  • einem Resolver
  • Resolve auf Erfolg Erstellen/Abweisen bei Ausfall
  • Rückgabe des erstellten Resolvers promise Eigenschaft

Ich habe mich gefragt, wie kann ich ach Iveve den gleichen Effekt der Ablehnung eines Versprechens, um eine catch mit Paketen, die bereits das Versprechen erstellen zu erhöhen, und ich verwende nur ihre .then Kette?

Was ich meine ist, mit reject auf meinem create Resolver wird schließlich eine catch an den Benutzer dieser Funktion.

Wie kann ich eine catch erhöhen, wenn ich nicht den Resolver habe. wie folgt das Versprechen Verkettungs:

function doSomthing(): Promise<someValue> 
    return somePackage.someMethodWithPromise().then((result)=> { 
     return someValueToTheNextThen; 
    }) 
} 

Die einzige Art, wie ich einige Pakete gesehen habe zu erreichen, dass durch die Rückgabe von { errors, result } Objekt ist, so dass die nächsten then überprüfen können, ob es irgendwelche Fehler sind und darauf reagieren, aber ich will um eine catch zu erhöhen und nicht auf Fehler in jedem einzelnen zu überprüfen then ich habe ..

Hoffe ich machte mich klar, bitte lassen Sie mich wissen, wenn etwas fehlt.

Vielen Dank im Voraus für die Hilfe!

Antwort

2

Die .then gibt nur eine Zusage zurück. Sie können einfach ein abgelehntes Versprechen erstellen und es von dort zurückgeben, wenn Sie feststellen, dass ein Fehler vorliegt.

return somePackage.someMethodWithPromise().then(result => { 
    if (result.erroneous()) return Promise.reject('erroneous data'); 
    return someValueToTheNextThen; 
}) 

Sie können auch einfach throw anError; vom then, die auch in einem catch Block abgefangen werden würde.

+0

Vielen Dank für Ihre schnelle Antwort, sieht sehr viel versprechend;) ill es morgen einen Schuss und Ihre Antwort akzeptieren, sobald wie ich diese Arbeit sehe :) –

3

Genau wie im synchronen Code können Sie dies erreichen, indem Sie einen Fehler ausgeben. Dies ist die idiomatische Sache zu tun, wenn Sie verspricht verwendet und sind bereits in einer then Kette:

function doSomething(): Promise<someValue> 
    return somePackage.someMethodWithPromise().then((result)=> { 
     if (badResult(result)) { 
      throw new Error('Bad result!'); 
     } 

     return someValueToTheNextThen; 
    }) 
} 


doSomething() 
    .then(result => { 
     // this will get skipped if an error was thrown 
    }) 
    .catch(error => { 
     // error will be caught here if one was thrown 
     console.error(error); 
    }); 
+0

Danke, krank gebe es eine Chance! –

Verwandte Themen