Node.js原理阻塞和EventEmitter及其继承的运用实战
作者:黎燃??????? 发布时间:2024-05-05 09:21:33
基本概念
简单地说,Node.js是在服务器端运行的JavaScript。 节点。
$ node
> console.log('Hello 黎燃!');
Hello 黎燃!
然而,对于node JS,概念完全不同。
使用node JS,我们不仅实现了一个应用程序,还实现了整个HTTP服务器。
事实上,我们的web应用程序和相应的web服务器基本相同。 让我们了解一下node JS应用程序由以下部分组成: 1.介绍所需模块:我们可以使用require命令加载node JS模块。 2.创建服务器:服务器可以监听客户端的请求,类似于Apache和nginx等HTTP服务器。 3.接收请求并响应请求的服务器很容易创建。客户端可以使用浏览器或终端发送HTTP请求,服务器收到请求后返回响应数据。
回调函数
Node.jsS异步编程的直接体现是回调。
阻塞代码
异步编程依赖于回调,但不能说在使用回调后程序将是异步的。 完成任务后将调用回调函数。节点使用大量回调函数。 节点的所有API都支持回调函数。
读取文件后,我们返回文件内容作为回调函数的参数。 这样,在执行代码时就不会阻塞或等待文件I/O操作。
回调函数通常显示为函数的最后一个参数:
function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }
创建主JS文件,代码如下:
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序执行结束!");
非阻塞代码
创建主JS文件,代码如下:
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
在以上两个例子中,我们理解阻塞调用和非阻塞调用之间的区别。第一个实例在读取文件后执行程序。 在第二个示例中,我们不需要等待文件被读取,因此我们可以在读取文件的同时执行以下代码,这大大提高了程序的性能。
因此,按顺序执行阻塞,不需要按顺序执行非阻塞。
Node.js 事件循环
Node.js使用事件驱动模型。 当web服务器接收到一个请求时,它会关闭并处理该请求,然后为下一个web请求提供服务。 当请求完成时,它将被放回处理队列。当它到达队列的开头时,结果将返回给用户。 引入 events 模块
var events = require('events');
创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);
触发事件
eventEmitter.emit('eventName');
Node 应用程序工作原理
创建主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()是一个用于读取文件的异步函数。如果在读取文件期间发生错误,error err对象将输出错误消息。
程序执行完毕
如果没有发生错误,readfile将跳过err对象的输出,并通过回调函数输出文件内容。
接下来,我们删除输入Txt文件。
执行结果如下:
程序执行完毕 Error: ENOENT, open 'input.txt'
EventEmitter 类
每次有新连接时,服务器对象的net将触发事件,而readstream对象的FS将在文件打开时触发事件。所有生成事件的对象都是EventEmitter实例中的事件。
引入 events 模块
var events = require('events');
创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
如果在实例化EventEmitter对象期间发生错误,将触发错误事件。添加新 * 时,将触发newlistener事件。删除 * 时,将触发RemovelListener事件。
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
event.on('some_event', function() {
console.log('some_event 事件触发');
});
setTimeout(function() {
event.emit('some_event');
}, 1000);
运行此代码,控制台在1秒_事件触发器后输出'some'。 触发事件时,将依次调用注册到此事件的事件 * ,并将事件参数作为回调函数参数传递。
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
on(event, listener)
注册指定事件的 * ,并接受字符串事件和回调函数。
server.on('connection', function (stream) {
console.log('someone connected!');
});
继承 EventEmitter
大多数时候,我们不直接使用EventEmitter,而是在对象中继承它。 所有支持事件响应的核心模块,包括FS、net和HTTP,都是EventEmitter的子类。
1.首先,具有实体函数的对象实现了符合语义的事件。事件的侦听和发生应该是对象的一种方法。
2.其次,JavaScript的对象机制是基于原型的,支持部分多重继承。继承EventEmitter不会干扰对象的原始继承关系。
来源:https://juejin.cn/post/7135094913405812773


猜你喜欢
- 虽然Python被说成是一种解释型语言,但是实际上,Python源程序要先经过编译,然后才能运行。与Java语言类似,Python源程序编译
- 代码:import sys # 导入系统模块获得cmd的参数import tracebackdef TEST(params):
- 今天在看框架的时候无意间看到了document.compatMode,经过一番资料查找,终于搞懂了。文档模式在开发中貌似很少用到,最常见的是
- 环境:pyecharts库,echarts-countries-pypkg,echarts-china-provinces-pypkg,ec
- 前言有时候我们需要在用户离开页面的时候,做一些上报来记录用户行为。又或者是发送服务器ajax请求,通知服务器用户已经离开,比如直播间内的退房
- 函数的参数:Python中函数定义非常简单,由于函数参数的存在,使函数变得非常灵活应用广泛;不但使得函数能够处理复杂多变的参数,还能简化函数
- 本文实例讲述了python中pass语句用法。分享给大家供大家参考。具体分析如下:1、空语句 do nothing2、保证格式完整3、保证语
- fallthrough:Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个s
- form 表单中的button按钮<button>提交</button> :放在form表单中,会有一个提交事件,会
- 本文实例讲述了Python栈算法的实现与简单应用。分享给大家供大家参考,具体如下:原理:栈作为一种数据结构,是一种只能在一端进行插入和删除操
- Python局部函数及用法通过前面的学习我们知道,Python 函数内部可以定义变量,这样就产生了局部变量,有读者可能会问,Python 函
- 常见的误解有: 1. 只用 ado.net ,无法进行动态 SQL 拼接。 2. 有几个动态参数,代码的重复量就成了这些参数的不同数量的组合
- 斐波那契数列(Fibonacci)最早由印度数学家Gopala提出,而第一个真正研究斐波那契数列的是意大利数学家 Leonardo Fibo
- 将数据写入Excel文件中,用python实现起来非常的简单,下面一步步地教大家。一、导入excel表格文件处理函数import xlwt注
- 基本的字符串位置查找方法Python 查找字符串使用 变量.find("要查找的内容"[,开始位置,结束位置]),开始位
- 数据添加函数实例//数据添加 public function newData($strName="") &n
- 本文实例为大家分享了python自动发送邮件的具体代码,供大家参考,具体内容如下#coding=utf8 ''&
- Pandas 处理数据的效率还是很优秀的,相对于大规模的数据集只要掌握好正确的方法,就能让在数据处理时间上节省很多很多的时间。Pandas
- 这篇文章主要介绍了python3获取文件中url内容并下载代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- MySQL、Sphinx及许多数据库和搜索引擎中的查询是单线程的。比如说,在一台32个CPU核心、16个磁盘的R910服务器上执