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. DMSFrame 之简单用法(一)

    1.DMSFrame是一个完整的ORM框架,框架相对来说也比成熟了.使用上有些地方还是比较方便的.DLL文件大约300K左右,但却可以支持各种方式的查询,完全的LINQ化的方式书写代码,更有利于维护. ...

  2. Heavy Transportation(最短路 + dp)

    Heavy Transportation Time Limit:3000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64 ...

  3. 使用EntityFramwork[6.1]进行级联保存的时候出现异常

    出现的异常:System.InvalidOperationException: Multiplicity constraint violated. The role 'IncomeItem_Creat ...

  4. Git 文件比较

    Git 的三个作业场: 工作区(Work Tree) 项目根目录下 .git 目录以外所有区域,是编辑项目文件的地方. 缓存区(Index) 工作区文件必须先保存在缓存区,之后从缓存区保存到仓库. 仓 ...

  5. 编译Libgdiplus遇到的问题

    https://github.com/mono/libgdiplus/releases 下载最新版本 解压并执行  ./autogen.sh,在执行此步时遇到如下问题,并帖出解决办法   问题:执行  ...

  6. Office Online简介

    一.什么是Office Online Office Online 将 Microsoft Office 体验扩展到了 Web 浏览器,这使您可以直接在存储文档的 SharePoint 网站上处理文档, ...

  7. coding代码仓库的配置和代码上传

    1.生成ssh 在桌面右键,选择Git Bash Here,进入操作界面,输入“ssh-keygen -t rsa -b 4096 -c "xxxxxxxx@xxx.com(自己注册时绑定的 ...

  8. Bucky – 免费开源的实时用户监控工具

    Bucky 是一个开源的实时用户监控工具,用于衡量用户在浏览器中使用 Web 应用程序时的性能.它可以自动测量你的网页需要多长时间来加载,Ajax 请求需要多长时间和各个函数需要实行多久. 您可能感兴 ...

  9. Python+Selenium进行UI自动化测试项目中,常用的小技巧2:读取配置文件(configparser,.ini文件)

    在自动化测试项目中,可能会碰到一些经常使用的但 很少变化的配置信息,下面就来介绍使用configparser来读取配置信息config.ini 读取的信息(config.ini)如下: [config ...

  10. Node.js面试题:侧重后端应用与对Node核心的理解

    Node是搞后端的,不应该被被归为前端,更不应该用前端的观点去理解,去面试node开发人员.所以这份面试题大全,更侧重后端应用与对Node核心的理解. node开发技能图解 node 事件循环机制 起 ...