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. 二十三、【开源】EFW框架Web前端开发之常用组件(FusionCharts图表、ReportAll报表等)

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...

  2. ISO给UIImageView增加点击事件

    自己做了一个九宫格,里面的图标都是由多张图片重叠构成,然后包装成一个button来使用: 遇到的问题是如何给这个“button”增加点击事件? 解决思路1:网友提示在该“button”上增加一个真正的 ...

  3. C#基础总结之四List-Hashtable-冒泡排序

    #region 第四天作业 名片--------ArrayList //ArrayList card = new ArrayList(); //card.Add("2202111001122 ...

  4. Android应用安全之Android APP通用型拒绝服务漏洞

    0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应 ...

  5. MyEclipse for Spring启动时报错"An internal error occurred during: 'Updating indexes'.Java heap space"的解决办法

    问题 MyEclipse for Spring在启动时,报如下错误:An internal error occurred during: 'Updating indexes'.Java heap sp ...

  6. 在 Ubuntu 配置 PPTP Server

    本文在 Ubuntu 12.4 或 14 亲测有效. 建立 PPTP 服务器 首先安装 pptp 服务器. # apt-get install pptpd 然后配置 pptpd. # sudo vi ...

  7. JavaScript 变量生命周期

    变量在它声明时初始化. 局部变量在函数调用时创建,当函数执行完毕后销毁,这和为什么要使用闭包也有一点关系,当然这是另外的话题了. 全局变量在页面(当前页面)关闭后销毁.

  8. codeforce A. Design Tutorial: Learn from Math

    题意:将一个数拆成两个合数的和, 输出这两个数!(这道题做的真是TMD水啊)开始的时候不知道composite numbers是啥意思,看了3遍才看懂.... 看懂之后又想用素数筛选法来做,后来决定单 ...

  9. 2014 网选 5012 Dice(bfs模板)

    /* 题意:就是给定两个筛子,每个筛子上6个面,每个面的数字属于[1,6], 且互不相同! 问a筛子最少经过按照题目规定的要求转动,达到和b筛子上下左右前后的数字相同! 思路:很直白的bfs,将每一种 ...

  10. DDD:Strategic Domain Driven Design with Context Mapping

    Introduction Many approaches to object oriented modeling tend not to scale well when the application ...