被人忽略的api,Domain

说起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) {
        
      }
});

你可能感兴趣的:(被人忽略的api,Domain)