2016-04-06 7 views
1

私は青い鳥の約束の中でエラーを投げている問題があります。次のコードを入力してください:ブルーバードの約束とドメイン

var Promise = require('bluebird'); 
var domain = require('domain'); 

var problem = function() { 
    return new Promise(function(resolve, reject){ 
     reject(new Error('Oops!')); 
    }); 
}; 

domain.create() 
    .on('error', function(e){ 
     console.log("Caught Error " + e.message) 
     process.exit(1); 
    }) 
    .run(function() { 
     problem().done(); 
    }); 

コンソールには、Caught Error Oops!が表示されます。しかし、それはエラーがドメイン内にキャッチされていないと私はコンソールで致命的なエラーとスタックトレースを見ているようです。

誰でも知っていますか?

+1

ドメインは廃止されましたので、使用しないでください。 –

+0

これはあまり役に立ちません。はい、私はドメインが将来的に置き換えられるかもしれないことを理解していますが、今日の今日では、それらを非難する要求がほぼ中核になってから約2年後です。ドメインは、まだ提供されている非常に特定の機能を置き換えるために、まだ具体化されていないため、廃止予定です。 –

+0

これはbluebirdの問題です。期待通りにQライブラリ関数からの約束です。 –

答えて

1

例外は実際にブルーバードによって処理されています。約束の拒否は、未処理の例外と同じではありません。代わりにsetTimeoutの中に実際の未処理の例外を作成すると、別のスタックにあるようにBluebirdで処理されないため、ドメインは期待どおりに動作します。

var Promise = require('bluebird'); 
var domain = require('domain'); 

var problem = function() { 
    return new Promise(function(resolve, reject){ 
     setTimeout(function() { 
      throw new Error('boom!'); 
     }, 1) 

    }); 
}; 

domain.create() 
    .on('error', function(e){ 
     console.log("Caught Error " + e.message) 
     process.exit(1); 
    }) 
    .run(function() { 
     problem().done(); 
    }); 
+0

良い答え。これは間違いなくprocess.nextTickを使用していますか? –

+0

process.nextTickはうまくいくかもしれませんが、私はsetTimeoutとnextTickのニュアンスの違いを忘れてしまいます –