读<了不起的Node.js>-04.事件轮询,非阻塞IO,V8

阻塞和非阻塞IO

  • node引入了一个复杂的概念,共享状态的并发
  • 得对回调函数如何修改当前内存中得变量(状态)特别小心
  • 特别注意对错误的处理是否会潜在的在修改这些状态,从而导致整个进程不可用
  • 时刻避免运行时错误的出现

阻塞

  • node里面有事件轮询,意味本质上来说,node会先注册时间,随后不断地询问内核这些时间是否已经分发,当时间分发时,对应的毁掉函数就会被触发,然后继续执行下去,如果没有事件触发,则继续执行其他代码,知道有新事件时,再去执行对应的回调函数
//事件轮询
console.log("hello");

setTimeout(() => {
    console.log('world');
}, 4000);

console.log('bye');

单线程的世界

  • node 是单线程的,在没有第三方模块的版主下是无法改变这一事实的
let start = Date.now();

setTimeout(function () {
    console.log(Date.now() -start);

    for (let i = 0 ; i<100000000;i++){

    }
},1000);

setTimeout(function () {
    console.log(Date.now() - start);
}, 2000);

  • 1001
    2000

  • 当第一个时间分发下去的时候,会执行js毁掉函数,由于回调函数需要执行很长一段时间

  • 所以下一个事件轮询的时间就不一定是2秒

  • node的众多模块都是非阻塞的,执行任务也变成了异步

错误处理

  • node应用依托扎起一个拥有大量共享状态的大进程中
  • 例子
let http = require('http');
http.creatServer(function(){
    thow new Error("错误不会被捕捉")
}).listen(3000)
  • 这个代码是跑不动的 因为报错没有被捕获 进程会崩溃
  • 避免上面的问题
  • 我们需要添加一个uncatchException处理器,这个时候进程不会退出,并且之后的事情都是可空的
  • 例子
let http = require('http');


process.on('uncaughtException', function (err) {
    console.log(err);
    process.exit(1);
});


http.createServer(function () {
    throw new Error("错误跳出来了");
}).listen(8080);

  • 除了uncaughtException 和error时间外,绝大部分node异步api接受的回调函数,第一个就是错误对象或者是null
let fs = require('fs');

fs.readFile('', function (err, data) {
    if (err) return console.error(err);
    console.log(data);
});
  • 错误的处理每一步都很重要,它能让你更加安全

堆栈追踪

  • 在js中,当错误发生的时候,在错误信息中可以看到一系列的函数调用,这称为堆栈追踪
  • 例子
function c() {
    b();

}

function b (){
    a();
}

function a() {
    throw new Error("错误出来额")
}

c();

/*
* E:\TheGreatNodeJs\day01\12.堆栈追踪.js:11
    throw new Error("错误出来额")
    ^

Error: 错误出来额
    at a (E:\TheGreatNodeJs\day01\12.堆栈追踪.js:11:11)
    at b (E:\TheGreatNodeJs\day01\12.堆栈追踪.js:7:5)
    at c (E:\TheGreatNodeJs\day01\12.堆栈追踪.js:2:5)
    at Object.<anonymous> (E:\TheGreatNodeJs\day01\12.堆栈追踪.js:14:1)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
*/
  • 从上可以看到导致错误发生的函数调用路径,下面我们来引入事件轮询查看一下
function c() {
    b();

}

function b (){
    a();
}

function a() {
    setTimeout(function () {

        throw new Error("错误出来额")
    },10)
}

c();

/*
* E:\TheGreatNodeJs\day01\13.堆栈追踪(事件轮询.js:13
        throw new Error("错误出来额")
        ^

Error: 错误出来额
    at Timeout._onTimeout (E:\TheGreatNodeJs\day01\13.堆栈追踪(事件轮询.js:13:15)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)
* */
  • 这里面try catch是不可行的,这会直接抛出未捕获异常,并且catch永远都不会执行
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容