node.js api文档小记

一、EventEmitter

构造与添加监听器

该对象由node的event模块提供,扩展它可以获得一个EventEmitter类,实例化后即可添加监听器

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

触发事件在最后一行,使用emit方法即可。

在事件处理器中(若是常规事件被调用),this默认指向事件绑定的EventEmitter,但如果使用了箭头函数,因为它遵循词法作用域,this将会指向一个空对象。

异步与同步

EventEmitter在默认情况下会同步执行所有的监听器,若想采用异步模式,使用setImmediate()或process.nextTick()方法

其他支持的功能

  • 监听器可以被调用多次,也可以只被调用一次,例如once()接口
  • EventEmitter绑定和销毁监听器时会对应地触发newListener和removeListener事件
  • 此外还有对监听器数量、名称、上限等作操作的各种接口,详情参见node.js官方文档

二、Stream

分类

  • Stream包括Readable Stream, Writable Stream, Duplex Stream和Transform Stream,前两种顾名思义,第三种指代既可读又可写的流,第四种则是可以修改或转换的Duplex Stream
  • 对象模式:流在默认情况下以Buffer, String或Uint8Array形式传输,但可以通过objectMode参数修改为对象模式,对象模式接受除null以外的其他数据类型

缓存及其意义

缓存容量由highWaterMark标识,避免内存压力过大,同时读和写有各自的缓存区,保证在速度有所差别的情况下,它们能各自独立工作。

可写流

  • HTTP requests, on the client
  • HTTP responses, on the server
  • fs write streams
  • zlib streams
  • crypto streams
  • TCP sockets
  • child process stdin
  • process.stdout, process.stderr

Writable类实现了多个控制读操作的方法,举drain方法为例,它在重新允许将数据写入流时触发(Writable.write()返回值即将由false变为true):

function writeOneMillionTimes(writer, data, encoding, callback) {
  let i = 1000000;
  write();
  function write() {
    let ok = true;
    do {
      i--;
      if (i === 0) {
        // last time!
        writer.write(data, encoding, callback);
      } else {
        // see if we should continue, or wait
        // don't pass the callback, because we're not done yet.
        ok = writer.write(data, encoding);
      }
    } while (i > 0 && ok);
    if (i > 0) {
      // had to stop early!
      // write some more once it drains
      writer.once('drain', write);
    }
  }
}

这段官方demo大约是做了这么一件事:将data写出一百万次,若是正常结束就执行callback回调,若是被迫中止(back pressure),则触发drain事件~

此外还有cork将写入的数据由缓存全部存入内存,直到调用Writable.uncork()时被重新激活

可读流

其包含的流类型与可写流类似,需要讨论的是它的两种模式,三个状态~

两种模式:包含flowing和paused,flow模式下,通过EventEmitter发布的data事件,数据将自动进行读写,速度快;paused模式下,需要显式地调用stream.read()方法来指定读取的数据块。

三个状态:指的是readable._readableState.flowing的状态,初始为null,没有消费者,因此数据也不会生成,但当模式变为flowing后它的值也会切换为true,启动生成数据-发布data事件的流程。

node.js的其余部分之后再写~


前端开发
我的前端学习之路
79 声望
2 粉丝
0 条评论
推荐阅读
BFF初探
在前后端联调时,有些麻烦出现的频率不低而且可能会较大程度影响开发效率,其中就包括前后端对接口数据格式设计的差异。两者一是基于领域模型,一是基于用户交互,因此设计出来的数据结构经常有差异,使得前端从...

太子长琴7阅读 9.1k

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7.1k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.6k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.7k评论 10

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5.1k评论 9

2022大前端总结和2023就业分析
我在年前给掘金平台分享了《2022年热点技术盘点》的前端热点,算是系统性的梳理了一下我自己对前端一整年的总结。年后,在知乎上看到《前端的就业行情怎么样?》,下面都是各种唱衰前端的论调,什么裁员,外包化...

i5ting27阅读 2.3k评论 4

封面图
从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 4.2k评论 9

79 声望
2 粉丝
宣传栏