详解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 相关文章推荐
Javascript 判断 object 的特定类转载
Feb 01 Javascript
Prototype源码浅析 Enumerable部分(二)
Jan 18 Javascript
Javascript中Event属性搜集整理
Sep 17 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
js判断登录与否并确定跳转页面的方法
Jan 30 Javascript
Javascript 是你的高阶函数(高级应用)
Jun 15 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
jQuery动画_动力节点节点Java学院整理
Jul 04 jQuery
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
Dec 06 Javascript
JS面向对象编程——ES6 中class的继承用法详解
Mar 03 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
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
JQuery autocomplete 使用手册
2010/04/01 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
详解js闭包
2014/09/02 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
python根据出生日期获得年龄的方法
2015/03/31 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
wxPython实现文本框基础组件
2019/11/18 Python
python能在浏览器能运行吗
2020/06/17 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
如何用python批量调整视频声音
2020/12/22 Python
Unix如何添加新的用户
2014/08/20 面试题
销售辞职报告范文
2014/01/12 职场文书
暑期培训心得体会
2014/09/02 职场文书
工作感想范文
2015/08/07 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
PHP实现两种排课方式
2021/06/26 PHP