Node.js原理阻塞和EventEmitter及其继承的运用实战

 更新时间:2022年08月24日 08:30:26   作者:黎燃​​​​​​​  
这篇文章主要介绍了Node.js原理阻塞和EventEmitter及其继承的运用实战,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

基本概念

简单地说,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不会干扰对象的原始继承关系。

到此这篇关于Node.js原理对于阻塞和EventEmitter及其继承的运用实战的文章就介绍到这了,更多相关Node.js EventEmitter 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何从头实现一个node.js的koa框架

    如何从头实现一个node.js的koa框架

    这篇文章主要介绍了如何从头实现一个node.js的koa框架,koa.js是最流行的node.js后端框架之一,有很多网站都使用koa进行开发,同时社区也涌现出了一大批基于koa封装的企业级框架。,需要的朋友可以参考下
    2019-06-06
  • nodejs 最新版安装npm 的使用详解

    nodejs 最新版安装npm 的使用详解

    本篇文章主要介绍了nodejs 最新版安装npm 的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Yarn的安装与使用详细介绍

    Yarn的安装与使用详细介绍

    不知道大家有没有觉察到Facebook近年大招频出。Yarn是Facebook最近发布的一款依赖包安装工具。Yarn是一个新的快速安全可信赖的可以替代NPM的依赖管理工具,Yarn正式发布没几天已经迅速达到了数万赞,就可以知道大家苦NPM久已。这篇文章将详细介绍Yarn的安装与使用。
    2016-10-10
  • nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较

    nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEq

    这篇文章主要介绍了node项目中遇到使用断言测试程序,看了下nodejs的api之后,对nodejs中assert断言的几个方法做个简单的记录,需要的朋友可以参考下
    2017-09-09
  • 一文学会如何升级npm管理的各依赖版本

    一文学会如何升级npm管理的各依赖版本

    npm在前端开发流程中提供了非常完善的自动化工具链,已成为每个前端开发者必备的工具,下面这篇文章主要给大家介绍了关于如何升级npm管理的各依赖版本,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Node.js Addons翻译(C/C++扩展)

    Node.js Addons翻译(C/C++扩展)

    这篇文章主要介绍了Node.js Addons翻译(C/C++扩展) 的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • node.js中http模块和url模块的简单介绍

    node.js中http模块和url模块的简单介绍

    这篇文章主要给大家简单介绍了关于node.js中的http模块和url模块,文中通过示例代码介绍的非常详细,对大家学习或者使用node.js具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • nodejs如何将多个目录文件合并成一个

    nodejs如何将多个目录文件合并成一个

    这篇文章主要介绍了nodejs如何将多个目录文件合并成一个问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 详解axios在node.js中的post使用

    详解axios在node.js中的post使用

    最近因为工作的原因在学习使用网络请求库,因为这个项目用的是Promise,所以就选择了axios,下面这篇文章主要给大家介绍了关于axios在node.js中的post使用的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起学习学习吧。
    2017-04-04
  • NodeJS自定义模块写法(详解)

    NodeJS自定义模块写法(详解)

    下面小编就为大家带来一篇NodeJS自定义模块写法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论