被人忽略的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) {
        
      }
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 1,143评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,803评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,956评论 25 709
  • 晚上睡觉中途醒了 脑子里还是昨晚看的this is us 迷迷糊糊中突然意识到这个剧采用倒叙或插叙 以时空交错方式...
    MissWater拒绝重口味阅读 212评论 0 0