2016-04-06 8 views
1

Ich habe ein Problem mit einem Fehler in einem Bluebird Versprechen zu werfen. Nehmen Sie den folgenden Code:Bluebird Promises und Domains

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(); 
    }); 

Ich würde erwarten, Caught Error Oops! in der Konsole zu sehen. Es scheint jedoch, dass der Fehler nicht innerhalb der Domäne gefangen ist, und ich sehe einen schwerwiegenden Fehler und Stack-Trace in der Konsole.

Weiß jemand warum?

+1

Domänen sind veraltet, Sie sollten sie nicht verwenden. –

+0

Das ist nicht sehr hilfreich. Ja, ich verstehe, dass Domains in der Zukunft ersetzt werden können, aber heute, fast 2 Jahre nach der Bitte, sie abzulehnen, sind sie immer noch im Kern. Domains sind noch ausstehend, da noch nichts vorhanden ist, um die sehr spezifische Funktionalität zu ersetzen, die sie bereitstellen. –

+0

Dies ist ein Problem mit Bluebird, verspricht von der Q-Bibliothek Funktion wie erwartet. –

Antwort

1

Die Ausnahme wird tatsächlich von Bluebird behandelt. Promise-Ablehnungen sind nicht dasselbe wie nicht behandelte Ausnahmen. Wenn Sie stattdessen eine echte unbehandelte Ausnahme innerhalb einer setTimeout erstellen, die von Bluebird nicht wie auf einem anderen Stapel behandelt wird, funktioniert Ihre Domäne wie erwartet.

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

Gute Antwort. Dies ist zweifellos besser mit process.nextTick? –

+0

process.nextTick könnte funktionieren/besser sein, ich vergesse die Nuance Unterschiede zwischen setTimeout und nextTick –