详解node.js 事件循环


Posted in Javascript onJuly 22, 2020

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。

Node.js 几乎每一个 API 都是支持回调函数的。

Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

事件驱动程序

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)

在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

详解node.js 事件循环

整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

以下程序绑定事件处理程序:

// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);

我们可以通过程序触发事件:

// 触发事件
eventEmitter.emit('eventName');

实例

创建 main.js 文件,代码如下所示:

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
 
// 创建事件处理程序
var connectHandler = function connected() {
  console.log('连接成功。');
 
  // 触发 data_received 事件 
  eventEmitter.emit('data_received');
}
 
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
  console.log('数据接收成功。');
});
 
// 触发 connection 事件 
eventEmitter.emit('connection');
 
console.log("程序执行完毕。");

接下来让我们执行以上代码:

$ node main.js
连接成功。
数据接收成功。
程序执行完毕。

Node 应用程序是如何工作的?
在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

三水点靠木 3water

创建 main.js 文件,代码如下:

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
  if (err){
   console.log(err.stack);
   return;
  }
  console.log(data.toString());
});
console.log("程序执行完毕");

以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

执行以上代码,执行结果如下:

程序执行完毕
三水点靠木 3water

接下来我们删除 input.txt 文件,执行结果如下所示:

程序执行完毕
Error: ENOENT, open 'input.txt'

因为文件 input.txt 不存在,所以输出了错误信息。

以上就是详解node.js 事件循环的详细内容,更多关于node.js 事件循环的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
prototype.js的Ajax对象
Sep 23 Javascript
javascript 页面只自动刷新一次
Jul 10 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
Oct 20 Javascript
对frameset、frame、iframe的js操作示例代码
Aug 16 Javascript
jquery showModelDialog的使用方法示例详解
Nov 19 Javascript
window.open 以post方式传递参数示例代码
Feb 27 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
Aug 01 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
Mar 16 Javascript
vue.js实现只能输入数字的输入框
Oct 19 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
Oct 26 Javascript
swiper4实现移动端导航栏tab滑动切换
Oct 16 Javascript
详解React中共享组件逻辑的三种方式
Feb 02 Javascript
jQuery+ThinkPHP实现图片上传
Jul 23 #jQuery
详解vue中v-on事件监听指令的基本用法
Jul 22 #Javascript
使用vue实现通过变量动态拼接url
Jul 22 #Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
Jul 22 #Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
Jul 22 #Javascript
vue props 一次传多个值实例
Jul 22 #Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
Jul 22 #Javascript
You might like
获得Google PR值的PHP代码
2007/01/28 PHP
php防盗链的常用方法小结
2010/07/02 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
php支付宝接口用法分析
2015/01/04 PHP
php判断当前操作系统类型
2015/10/28 PHP
学习PHP session的传递方式
2016/06/15 PHP
javascript 简练的几个函数
2009/08/29 Javascript
理解Javascript_03_javascript全局观
2010/10/11 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
跟老齐学Python之数据类型总结
2014/09/24 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
Linux中如何用命令创建目录
2016/12/02 面试题
酒店管理专业毕业生推荐信
2013/11/10 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
医德考评自我评价
2014/09/14 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
个人优缺点总结
2015/02/28 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
困难补助申请报告
2015/05/19 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书
2015年教师节广播稿
2015/08/19 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL