2016-05-09 5 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. 
}) 

親の約束にバブルアップするためのネストされた約束事から例外を得るにはどうすればよいですか? returnキーワードを使用Bluebird - ネストされた約束事のエラーを伝播する方法

+0

は、あなたが 'then'コールバックを含め、すべての非同期機能からの' return'約束を、持っています機能。さもなければ、彼らは待たれることができず、拒否も転送しません。 – Bergi

答えて

3

あなたのコードは次のように簡略化することができます。

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

編集:これは正しい方法であれば、しかし、約束のキャンセルが関与している場合

わかりませんエラーフローを泡立たせたい場合は、決して決して解決しないエラーをスローします(起こった場合):

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

この例では、しかし、私はそれが行われていない解決をしたい – Jonah

+0

@Jonah例外を泡立てる唯一の方法は、結束は、結局のところ、誓約は、コールバック地獄... – mido

+0

私は同意し、ネスティングは避けるべきです。しかし、入れ子が必要な場合がありました。しかしそれは間違っている可能性があります。ネスティングは決して必要ではないと言いますか? – Jonah

1

まず、ネストされた約束を使用しないでください。また、ネストされた関数から約束した結果を返すには、常にreturnステートメントを使用します。あなたの例では、PromiseB結果は決して使用されず、PromiseBが解決される前にメイン約束が解決されます。現在の状況は、あなたが親の約束を上方にバブルエラーにPromise.reject機能を使用することができますでは

:いつものように

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

一般的な入れ子の約束には何も問題はありません。クロージャーや専用のエラー処理に非常に便利です。 – Bergi

+0

@Bergi私は同意しますが、時には便利ですが、3レベル以上のネストされた約束のコードがよく見えます。とにかく、ネストされた約束の代わりに、これらの約束で地元の機能を使う方がはるかに良い。 – alexmac

+0

私の場合、約束が取り消されることがあるため、ネストされた約束を返すことはできません。返された場合、キャンセルは親を含むチェーン全体をキャンセルしますが、ネストされた約束を取り消したいだけです。しかし、私は元の質問でそれを指定しなかったので、私はちょうどこれを受け入れ、新しい質問をするかもしれません – Jonah

関連する問題