美文网首页
事件循环

事件循环

作者: One_Hund | 来源:发表于2018-09-17 16:38 被阅读0次
  • 事件触发不会马上执行回调,会加入队列,队列中按照先进先出的顺序,逐个执行事件绑定的回调方法
  • 新事件产生后会插在队尾,按照先进先出的顺序执行回调
  • 事件队列每次只会执行一个事件,一个事件的代码逻辑没有执行完是不会开始下一个的
  • 事件就是程序执行中发生的事情,比如你敲击了键盘、收到网络请求,或者是任务的状态发生了改变,比如读取文件内容完成了,也是触发一个事件

Node.js中的定时器

这里我们只介绍3个非I/O异步接口,setTimeoutsetImmediateprocess.nextTick

在node.js的事件循环中,处理各种回调是有分多个阶段的,大致如下:

循环开始

    执行setTimout、setInterval回调

    执行I/O回调

    执行setImmediate回调

循环结束
setTimeout(callback, delay[, …arg])

计划在 delay 毫秒执行 callback。返回一个可能被 clearTimeout() 用到的 timeoutObject 。

对照上面的的循环阶段不难理解,执行setTimeout的时机是在每次循环的开头,在这个阶段将会执行所有定时器时间到了或者超过的回调。

需要注意的是这里如果上一个方法执行时间过长,可能导致定时器回调实际执行的时间被延后。

function waste(time) {
    let start = Date.now();
    while(Date.now() - start < time);
}

setTimeout(() => {
    console.log('exec after 1000ms');
    waste(5000);
}, 1000);

setTimeout(() => {
    console.log('exec after 2000ms');
}, 2000);

上面的代码1000ms后会执行第一个定时器的回调,在这个回调里面又会占用CPU至少5000ms时间,第二个定时器回调执行的时候已经要等到6000ms以后了。

setImmediate(callback, [arg], [...])

计划“马上”执行 callback。返回一个 immediateObject 以供 clearImmediate() 在有需要的时候使用。

按照上面的循环阶段,我们可以看到 setImmediate 是在循环的末尾阶段被执行。它不用指定延时时间,只要前面的I/O阶段回调被执行完立马会执行 setImmediate 指定的回调方法。

相比 setTimeout(callback, 0),setImmediate 是一个更好的选择,它在nodejs的内部实现更加高效。

在 setImmediate 指定的回调中继续调用 setImmediate,其回调将会在下一轮循环的同样阶段被执行。因此可以递归调用达到每次 tick 都触发一次回调的效果:

function execEachTick() {
    setImmediate(execEachTick);
    console.log('exec each tick');
}

setImmediate(execEachTick);
process.nextTick(callback[, ...args])

计划“立即”执行 callback。不同于 setTimeout 跟 setImmediate,它没有特定的处理阶段,而是在每个阶段后面都可以执行其设定的回调方法。调用 process.nextTick 是最快速执行异步回调的方法。

它的接口命名跟功能个人觉得跟 setImmediate 是反过来的(手动滑稽),process.nextTick 才是立即执行,而 setImmediate 是下一次tick执行。

因此在process.nextTick不能递归的调用,因为递归的调用相当于无限循环:

function fn() {
    process.nextTick(fn);
}

process.nextTick(fn);

相关文章

  • 浅谈JavaScript事件循环与Vue的批量异步更新策略

    在介绍事件循环之前,首先要明确以下几个关键概念。事件循环,同步和异步任务,宏任务,微任务。 一.事件循环 事件循环...

  • 并发:事件循环 & asyncio

    1. 事件循环机制 1.1. 什么是事件循环 事件循环(Event Loop),即通过轮询方法监控事件; asyn...

  • 探索未知种族之osg类生物---呼吸分解之事件循环一

    事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环、更新循环以及渲染循环了。首先我们来区分一下事件循环和渲染循...

  • 事件循环

    先来一张图 下面上写的代码,在看浏览器的主线程的执行情况 再来上主线程页面初始化加载时的情况 setInterva...

  • 事件循环

    事件触发不会马上执行回调,会加入队列,队列中按照先进先出的顺序,逐个执行事件绑定的回调方法 新事件产生后会插在队尾...

  • 事件循环

    总结:第一次循环先执行宏任务中的队头任务,清空调用栈后执行微任务,然后第二次循环执行宏任务的队头任务,.........

  • 事件循环

    原文链接:https://zhuanlan.zhihu.com/p/26229293最近琢磨了好久的Javascr...

  • 事件循环

    单线程 .JavaScript是单线程javascript是单线程,无论后面加了什么标准,什么操作,都不能改变ja...

  • 事件循环。。

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 A...

  • 事件循环

网友评论

      本文标题:事件循环

      本文链接:https://www.haomeiwen.com/subject/lwbqnftx.html