详解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 相关文章推荐
IE6下JS动态设置图片src地址问题
Jan 08 Javascript
jquery通过a标签删除table中的一行的代码
Dec 02 Javascript
JS获取网页属性包括宽、高等等
Apr 03 Javascript
jQuery简单图表peity.js使用示例
May 02 Javascript
基于javascript实现图片切换效果
Apr 17 Javascript
AngularJS 2.0入门权威指南
Oct 08 Javascript
基于react框架使用的一些细节要点的思考
May 31 Javascript
详解用webpack2搭建angular2的项目
Jun 22 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
Dec 15 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
Jul 25 Javascript
node中使用es6/7/8(支持性与性能)
Mar 28 Javascript
jQuery 移除事件的方法
Jun 20 jQuery
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
PHP 操作文件的一些FAQ总结
2009/02/12 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
Vue基础配置讲解
2019/11/29 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
自己使用总结Python程序代码片段
2015/06/02 Python
用Python编写简单的微博爬虫
2016/03/04 Python
python批量制作雷达图的实现方法
2016/07/26 Python
Python 备份程序代码实现
2017/03/06 Python
对Python中内置异常层次结构详解
2018/10/18 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
python 内置函数汇总详解
2019/09/16 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
Python while循环使用else语句代码实例
2020/02/07 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
测绘工程本科生求职信
2013/10/10 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL
box-shadow单边阴影的实现
2023/05/21 HTML / CSS