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!コンソールに表示されることを期待しています。ただし、エラーはドメイン内でキャッチされていないようで、コンソールに致命的なエラーとスタック トレースが表示されます。

誰かが理由を知っていますか?

4

1 に答える 1

1

例外は、実際には Bluebird によって処理されています。Promise の拒否は、未処理の例外と同じではありません。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();
    });
于 2016-04-07T01:44:57.880 に答える