2016-05-09 5 views
5
PromiseA().then(function(dataA){ 
    if (dataA.foo == "skip me") 
     return ?? //break promise early - don't perform next then() 
    else 
     return PromiseB() 
}).then(function(dataB){ 
    console.log(dataB) 
}).catch(function (e) { 
    //Optimal solution will not cause this method to be invoked 
}) 

上記のコードはどのようにして早期に壊れるように修正できますか?Bluebird - 早期に約束を破る方法

+0

リターンPromise.reject(新しいエラー( "私を捕まえてください")) – Yerken

+0

またはより良い '新しいエラーを投げる( "私を捕まえてください");'。これは重複のように見えます。 – Shanoor

+1

しかし、その場合catch()が呼び出されますが、これは嫌です。 – Jonah

答えて

5

ブルーバードはcancel a promiseすることができます:

var Promise = require('bluebird'); 
Promise.config({ 
    // Enable cancellation 
    cancellation: true, 
}); 

// store the promise 
var p = PromiseA().then(function(dataA){ 
    if (dataA.foo == "skip me") 
     p.cancel(); // cancel it when needed 
    else 
     return PromiseB(); 
}).then(function(dataB){ 
    console.log(dataB); 
}).catch(function (e) { 
    //Optimal solution will not cause this method to be invoked 
}); 
+0

定義する必要はありませんしかし、呼び出される前に?最初にpが呼び出されると、まだ定義されていないように見えます。 – Jonah

+0

@Jonah私たちは非同期環境にあり、関数はすぐには実行されません(次のティックにあります)。 – Shanoor

+0

はチェーン内の最後のステートメントの値に 'p'をセットしていません - この場合は' catch'ですか?しかし、 'p.cancel()'が – Jonah

関連する問題