2016-05-09 7 views
4
PromiseA().then(function(){ 
    PromiseB().catch(function (e) { 
     throw e; 
    }) 
}).catch(function (e) { 
    // I want exceptions thrown in the nested promise chain to end up here. 
}) 

Wie bekomme ich Ausnahmen von verschachtelten Versprechen, um auf die übergeordneten Versprechen zu sprudeln?Bluebird - Wie propagiert man Fehler in verschachtelten Versprechen

+0

Wie immer haben Sie 'return' Versprechen von allen asynchronen Funktionen, einschließlich' then' Rückruf Funktionen. Andernfalls können sie nicht erwartet werden und werden auch keine Ablehnungen weiterleiten. – Bergi

Antwort

3

die return Schlüsselwort verwenden,

Code kann vereinfacht werden:

PromiseA().then(function(){ 
    return PromiseB(); 
}).catch(function (e) { 
    // I want exceptions thrown in the nested promise chain to end up here. 
}) 

Edit:

Nicht sicher, ob dies der richtige Weg ist, aber wenn Versprechen Stornierung beteiligt ist und Sie möchten nur den Fehlerfluss aufblähen, können Sie Ihr Versprechen in benutzerdefiniertes Versprechen einwickeln, das nie löst aber Fehler (wenn es passiert):

PromiseA().then(function(){ 
    var myPromise = PromiseB().then...; 
    return new Promise(function(resolve, reject){ 
     myPromise.catch(reject) 
    }) 
}).catch(function (e) { 
    // I want exceptions thrown in the nested promise chain to end up here. 
}) 
+0

In diesem Beispiel ja, aber ich will eine Lösung, wo das nicht gemacht wird – Jonah

+0

@Jonah der einzige Weg zu Blase Ausnahme ist das Versprechen zurückzugeben, auch Versprechen Verkettung ist ratsam im Vergleich zu Verschachtelung, schließlich sind Versprechungen eine Alternative zu die Callback-Hölle ... – mido

+0

Ich stimme zu, Verschachtelung sollte vermieden werden. Ich habe jedoch einige Fälle gefunden, wo Verschachtelung notwendig ist. Es könnte aber auch falsch sein. Würden Sie sagen, dass Nistungen niemals notwendig sein sollten? – Jonah

1

Vermeiden Sie verschachtelte Versprechen. Verwenden Sie auch immer die return-Anweisung, um das Versprechensergebnis der verschachtelten Funktion zurückzugeben. In Ihrem Beispiel wird PromiseB Ergebnis nie verwendet und Hauptversprechen-Kette wird aufgelöst, bevor PromiseB aufgelöst wird.

In Ihrem aktuellen Situation, Sie Promise.reject Funktion zu sprudeln Fehler an die Mutter Versprechen verwenden:

PromiseA() 
    .then(function() { 
     return PromiseB() 
      .catch(function (err) { 
       // TODO: error processing 
       return Promise.reject(err); 
      }); 
    }) 
    .catch(function(err) { 
     // Here you'll get the same err object as in first catch 
    }); 
+0

Es ist nichts falsch mit verschachtelten Versprechen im Allgemeinen. Sie können bei Schließungen oder für die dedizierte Fehlerbehandlung sehr nützlich sein. – Bergi

+0

@Bergi Ich stimme zu, manchmal ist es nützlich, aber ich sehe Code mit 3 oder mehr Ebenen von verschachtelten Versprechen, und es sieht hässlich aus. Anyway statt verschachtelt verspricht viel besser, lokale Funktionen mit diesen Versprechen zu verwenden. – alexmac

+0

In meinem Fall kann das verschachtelte Versprechen nicht zurückgegeben werden, da das Versprechen in einigen Fällen abgebrochen wird. Wenn es zurückgegeben wurde, würde die Stornierung die gesamte Kette einschließlich der übergeordneten stornieren, aber ich möchte nur die verschachtelten Versprechen abgebrochen. Allerdings habe ich das in der ursprünglichen Frage nicht angegeben, also kann ich das einfach akzeptieren und eine neue Frage stellen – Jonah

Verwandte Themen