说起domain这个api,相信很多人都觉得很陌生,因为该api是从node版本0.10 才有的,而大量国内教程基本都停留在0.8版本,所以很多人忽略了这个api,甚至不知道,实际上,这是一个非常实用的api
Domain解决了什么问题?
我们来看一段代码
var fs = require('fs');
try {
fs.readFile('test.txt', function (err, data) {
fewfe
console.log(err, data);
})
} catch (e) {
console.log(e);
}
实际上,很多教程都会以类似上面的代码做例子,来说明在node.js 里面,传统异常的捕捉方式,将会失效。因为当在调用fs.readFile的时候,程序将会立即执行完毕,直接跳出try...catch的包裹范围,等待回调的时候,由于没有try...catch 程序直接崩溃,而domain将会完美的解决这件事情。
var fs = require('fs');
var domain = require('domain');
var d = domain.create();
d.run(function () {
fs.readFile('test.txt', function (err, data) {
cwefewf
console.log(err, data);
});
})
d.on('error', function (err) {
console.log(err); //[ReferenceError: cwefewf is not defined]
})
domain 将会巧妙地监听回调中产生的错误 。
Domain原理
在执行domain.run 的时候,会将回调逻辑上下文保存下来,放到栈里面,当node.js在执行每一个tick的时候,都会检查domain队列里面的上下文,如果发现存在监听的上下文后,就会利用try.. catch包裹具体上下文的执行逻辑,当捕捉到错误后,通过事件error的事件方式抛出去。
伪代码
fs.readFile('demo1.txt', function () {
try {
cwefewf
console.log(err, data);
} catch (e) {
}
});