Node中的事件循环

  事件循环是Node的核心,正是因为有了事件循环JS才能够在服务端占有一席之地。JS是一种单线程语言,但是它的执行环境是多线程的在加上JS的事件驱动这一特点,使使JS在执行的过程中没执行到一个异步操作就交由后台处理然后继续向下执行,在遇上一个异步操作又交由后台处理,JS的执行线程不会发生阻塞,一旦JS代码执行完毕就会去后台查看有没有满足条件的异步操作一旦有满足条件的就执行事先定义好的处理函数。

  在Node中通过EventEmitter(事件发生器)来实现这种功能,EventEmitter和我们在浏览器中使用自定义事件的方式是差不多的,其使用方式为:

var events = require("events").EventEmitter;
var event = new events;
event.on("zt",function(){console.log(111)});
event.emit("zt");

  通过require("events").EventEmitter来获取事件发生器函数,我们在实例化一个对象,这样这个对象就获得了事件发生器原型上的方法,分别为on和emit,我们可以通过on()函数来注册一个事件,它可以接收两个参数第一个参数为eventName,第二个参数为对应的事件处理函数。在绑定事件之后可以通过emit来主动触发事件。

  事件发生器可以为一个事件绑定多个事件处理函数,并且它的执行顺序是可以保证的,在前面的优先执行:

var events = require("events").EventEmitter;
var event = new events;
event.on("zt",function(){console.log("我是第一个处理函数")});
event.on("zt",function(){console.log("我是第二个处理函数")});
event.emit("zt");

  事件处理函数同样可以接收参数,在主动触发时传入参数即可:

var events = require("events").EventEmitter;
var event = new events;
event.on("zt",function(a,b){console.log("我是第一个处理函数"+"参数1:"+a+"参数2:"+b)});
event.on("zt",function(a){console.log("我是第二个处理函数"+"参数1:"+a)});
event.emit("zt","AA","BB");

  在使用emit()时第一个参数表示要触发的事件,后面的参数就表示事件处理函数的参数。

  事件发生器可以实现异步,但其本身是同步的:

var events = require("events").EventEmitter;
var event = new events;
event.on("zt",function(){console.log("我是第一个处理函数")});
event.on("zt",function(){console.log("我是第二个处理函数")});
setTimeout(function(){
event.emit("zt");
},1000);
event.on("zt",function(){console.log("我是第三个处理函数")});

  事件发生器的on方法等价于一个存储方法,它会把事件名和事件处理函数存储起来,并不会执行,一旦使用emit触发事件之后执行已经存储的处理函数,在emit触发事件后已经添加的事件处理函数就会立即执行,这个操作并不是异步的。

var events = require("events").EventEmitter;
var event = new events;
event.on("zt",function(){console.log("我是第一个处理函数")});
event.on("zt",function(){console.log("我是第二个处理函数")});
event.emit("zt");
event.on("zt",function(){console.log("我是第三个处理函数")});

  将上面的定时器去掉,如果emit是一个异步操作那么第三个处理函数就会执行,但是事实上程序只是执行了前两个事件处理函数。

初学Node(四)事件循环的更多相关文章

  1. Node.js 事件循环(Event Loop)介绍

    Node.js 事件循环(Event Loop)介绍 JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”.Node.js在JavaScript的基 ...

  2. Node.js事件循环

    Node JS是单线程应用程序,但它通过事件和回调概念,支持并发. 由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性.Node JS使用观察者模式.Node ...

  3. 6、Node.js 事件循环

    #########################################################################################Node.js 事件循 ...

  4. [译] 所有你需要知道的关于完全理解 Node.js 事件循环及其度量

    原文地址:All you need to know to really understand the Node.js Event Loop and its Metrics 原文作者:Daniel Kh ...

  5. 浏览器与Node的事件循环(Event Loop)有何区别?

    前言 本文我们将会介绍 JS 实现异步的原理,并且了解了在浏览器和 Node 中 Event Loop 其实是不相同的. 一.线程与进程 1. 概念 我们经常说 JS 是单线程执行的,指的是一个进程里 ...

  6. How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式

    个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...

  7. Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...

  8. Node.js 学习(五)Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...

  9. Node.js 事件循环机制

    Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程.高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发 ...

  10. The Node.js Event Loop, Timers, and process.nextTick() Node.js事件循环,定时器和process.nextTick()

    个人翻译 原文:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ The Node.js Event Loop, Ti ...

随机推荐

  1. fdisk命令使用说明

    CentOS我新建了几个分区,比如/dev/sda4,sda5我想挂在一个目录下,用mount  /dev/sda5  /disk ,总提示mount:you must specify the fil ...

  2. 界面排版-TableLayout的stretchColumns方法

    1.先把XML內的預設RelativeLayout排版方式清空,在去Layout區拉一個TableLayout的到表單上,XML下會出現下面程式碼       <TableLayout xmln ...

  3. 找出链表中倒数第 k 个结点

    /* 题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表 的尾指针. 链表结点定义如下: struct node { int data; struct node * ...

  4. 关于4K Block Size的Device和 Aligned IO

    背景:最近采购了一批新的服务器,底层的存储设备的默认physical sector size从原有的 512B 改为了 4K. 装完系统以后,在做数据库物理备份恢复时xtrabackup报了这么一个错 ...

  5. 解决两台centos虚拟机Telnet服务无法联机的问题

    关闭防火墙 [root@localhost ~]# service iptables stopiptables: Flushing firewall rules:                    ...

  6. Mysql学习笔记(七)查(补充)

    PS:五一还是要学习...虽然有点苦逼..但是路是自己选的,那么自己就要坚持的走下去... 学习内容: 1.数据库查找的补充... 查找涉及的东西比较多,在上一个章节没有完全介绍...我们还是以pet ...

  7. SQL Server 2014,改善的临时表缓存

    在一些先决条件下,SQL Server可以缓存临时表(cache Temp Tables).缓存临时表意味着当你创建反复创建同个临时表时,SQL Server就可以重用它们.这会从整体上大幅度提高你的 ...

  8. 用Javascript实现回到顶部效果

    用Javascript实现回到顶部效果 经常看到网页中有回到顶部的效果,今天也研究一下回到顶部有哪些方法.众所周知,用锚链接是实现回到最简单的方法,但是从用户体验效果来说,并不是最好的.(锚链接回到顶 ...

  9. ASP.NET MVC 在控制器中接收视图表单POST过来的数据方法

    方法一:通过Request.Form [HttpPost]        public ActionResult Test()        {            string id=Reques ...

  10. [团队项目]sprint3 & 团队贡献分

    希望各组认真准备,拿出最好的阵容最好的状态,展示一学期的学习与工作成果. 各组注意完成sprint3的博客,写上团队贡献分. 将演示PPT(如果有)和代码上传到github. 截止日期:2016.6. ...