2016-04-06 17 views
1

Bir bluebird vaadinde bir hata atma ile ilgili bir sorunum var. Aşağıdaki kodu alın:Bluebird Promises and Domains

Konsolda Caught Error Oops! görmeyi beklerim. Ancak, hatanın etki alanı içinde yakalanmadığı görülüyor ve konsunda önemli bir hata ve yığın izi görüyorum.

Neden olduğunu bilen var mı?

+1

Etki alanları kullanımdan kaldırılmıştır, bunları kullanmamalısınız. –

+0

Bu çok yardımcı olmuyor. Evet, etki alanlarının gelecekte değiştirilebileceğini anlıyorum, ancak bugün itibariyle talepleri reddedildikten neredeyse 2 yıl sonra hâlâ çekirdekte. Etki alanları, henüz sağladıkları çok özel işlevleri yerine getirmek için henüz hiçbir şey yapılmadığı için hala kullanımdan kaldırılmayı bekliyor. –

+0

Bu, bluebird, Q kitaplığı işlevinden beklendiği gibi vaatler ile ilgili bir sorundur. –

cevap

1

Özel durum aslında Bluebird tarafından ele alınmaktadır. Sözlü reddetmeler, işlenmemiş istisnalar ile aynı değildir. Bunun yerine, bir setTimeout içinde gerçek bir işlenmemiş özel durum oluşturursanız, bu nedenle Bluebird tarafından farklı bir yığında olacağı için işlenmeyecektir, etki alanınız beklendiği gibi çalışacaktır.

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

İyi cevap. Process.nextTick kullanarak bu hiç şüphesiz ki? –

+0

process.nextTick işe yarayabilir/daha iyi olabilir, setTimeout ve nextTick arasındaki nüans farklarını unuttum –