iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Node中的streams流的具体使用
  • 386
分享到

Node中的streams流的具体使用

2024-04-02 19:04:59 386人浏览 泡泡鱼
摘要

目录node中的streams流转换流创建对象模式最后Node中的streams流 streams流是Node中的最好的特性之一。它在我们的开发过程当中可以帮助我们做很多事情。比如通

Node中的streams流

streams流是Node中的最好的特性之一。它在我们的开发过程当中可以帮助我们做很多事情。比如通过流的方式梳理大量数据,或者帮我们分离应用程序。

和streams流相关的内容有哪些呢?大致有这么几点:

  • 处理大量数据
  • 使用管道方法
  • 转换流
  • 读写流
  • 解耦I/O

转换流

Node中的流其实是允许我们进行异步编程的。最常见的就是转换流,它就像是一个接收输入并且产生输出的大黑盒子。

举个例子:

const through = require('through2')
const upper = through((chunk, enc, cb) => {
  cb(null, chunk.toString().toUpperCase())
})

process.stdin.pipe(upper).pipe(process.stdout)

执行它,我们在终端输入的内容,它会转换成大写并且重新输出到终端。

through2模块在核心流的构造器上又加了一层。当我们创建upper时,我们给through传了一个回调函数进去,这个回调函数就是转换方法。流中的每段数据都将通过这个方法,chunk表示数据,enc表示数据的编码格式,cb是一个回调函数,我们执行它表示我们已经完成了数据处理,并且进行下一步处理。

使用through2模块进行处理数据,一方面可读性更强,另一方面,可以保持Node版本之前的行为一致。

创建

大多数情况下,当我们使用核心模块时,我们会直接使用。例如:

const fs = require('fs')
const stream = require('stream')

但是经验告诉我们:不要直接使用核心流模块。我们可以使用readable-stream,虽然名字不一样,但是这确实可以保证我们在不同的Node版本之间保持很好的一致性。所以在代码中我们应该尽可能的使用readable-stream

const stream = require('readable-stream')

看这个例子:

const stream = require('readable-stream')
const util = require('util')

function MyTransfORM(opts){
  stream.Transform.call(this,opts)
}

util.inherits(MyTransform,stream.Transform)

MyTransform.prototype._transform = function(chunk,enc,cb){
  cb(null,chunk.toString().toUpperCase())
}

const upper = new MyTransform()
process.stdin.pipe(upper).pipe(process.stdout)

在Node的早期版本中,这是创建流的标准方式。但是es6出现以后,有一种更简单的方法。

const {Transform} = require('readable-stream')

class MyTransform extends Transform {
  _transform(chunk,enc,cb){
    cb(null,chunk.toString().toUpperCase(),)
  }
}
const upper = new MyTransform()
process.stdin.pipe(upper).pipe(process.stdout)

对象模式

如果我们的流不是返回的序列换的数据,一般是buffer或者string,我们需要将它转换成一个对象。但是我们需要知道具体传了多少数据过来。

默认情况下,当不使用对象模式时,流将在暂停前缓冲大约16KB的数据。使用对象模式时,当缓冲了16个对象后,它将开始暂停。

再来看一个例子:

const through = require('through2')
const ndJSON = require('ndjson')

const xyz = through.obj(({ x, y }, enc, cb) => {
  cb(null, { z: x + y })
})

xyz.pipe(ndjson.stringify()).pipe(process.stdout)

xyz.write({ x: 199, y: 3 })

xyz.write({ x: 10, y: 12 })

这个例子会打印下面的结果

我们用through2模块的obj方法创建了一个流。然后通过pipe方法write的信息进行stringify然后再传给process.stdout,最后返回了计算后的结果。

我们也可以使用readable-stream模块来实现这个:

const {Transform} = require('readable-stream')
const {serialize} = require('ndjson')
const xyz = Transform({
  objMode:true,
  transform:({x,y},enc,cb)=>{
    cb(null,{z:x+y})
  }
})
xyz.pipe(ndjson.stringify()).pipe(process.stdout)

xyz.write({ x: 199, y: 3 })

xyz.write({ x: 10, y: 12 })

同样可以实现上面的效果。

最后

到此这篇关于Node中的streams流的具体使用的文章就介绍到这了,更多相关Node streams流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Node中的streams流的具体使用

本文链接: https://www.lsjlt.com/news/140077.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node中的streams流的具体使用
    目录Node中的streams流转换流创建对象模式最后Node中的streams流 streams流是Node中的最好的特性之一。它在我们的开发过程当中可以帮助我们做很多事情。比如通...
    99+
    2024-04-02
  • shell流程控制语句的具体使用
    目录前言一、if - else 语句案例需求描述二、case语句三、while 语句四、until语句五、for语句for 语法写法一for 语法写法二for 语法写法三无...
    99+
    2023-05-19
    shell 流程控制语句
  • shell 流程控制语句的具体使用
    目录前言一、if - else 语句案例需求描述二、case语句三、while 语句四、until语句五、for语句for 语法写法一for 语法写法二for 语法写法三无限for循环六、select 语句八、...
    99+
    2023-05-12
    shell 流程控制语句
  • java中的DateTime的具体使用
    目录1.初始化时间2.按格式输出时间(将DateTime格式转换为字符串)3.将字符串转换为DateTime格式4.取得当前时间5.计算两个日期间隔的天数6.增加日期7.减少日期8....
    99+
    2024-04-02
  • React中useRef的具体使用
    相信有过React使用经验的人对ref都会熟悉,它可以用来获取组件实例对象或者是DOM对象。 而useRef这个hooks函数,除了传统的用法之外,它还可以“跨渲染周期”保存数据。 ...
    99+
    2024-04-02
  • python中pywifi的具体使用
    目录写在前面pywifi常量接口wifi连接代码写在前面 无线AP(Access Point):即无线接入点 python的wifi管理模块叫pywifi 安装 pip instal...
    99+
    2023-03-06
    python pywifi
  • Golang中Model的具体使用
    目录导语使用之前的准备开始使用发布版本引用自己封装的包修改版本导语 我们都知道在Golang中我们一般都是设置GOPATH目录,这个目录主要存放我们的第三方包,这个方式一直不是很方便...
    99+
    2023-05-14
    Golang Model使用 Golang Model
  • java中Thread.sleep()的具体使用
    目录sleep功能介绍:sleep Thread.sleep()被用来暂停当前线程的执行,会通知线程调度器把当前线程在指定的时间周期内置为wait状态。当wait时间结束,线程状态重...
    99+
    2023-05-17
    java Thread.sleep
  • numpy中nan_to_num的具体使用
    在Numpy中NaN值一般出现在数据清洗前,出现这个值说明这个数据是缺失的 在有些时候我们会选择直接删除这些数据,但有些时候这些数据是不能删除的,这个时候我们就需要使用一些方法将np...
    99+
    2024-04-02
  • pandas中df.rename()的具体使用
    df.rename()用于更改行列的标签,即行列的索引。可以传入一个字典或者一个函数。在数据预处理中,比较常用。 官方文档: DataFrame.rename(self, mappe...
    99+
    2024-04-02
  • django中websocket的具体使用
    websocket是一种持久化的协议,HTTP协议是一种无状态的协议,在特定场合我们需要使用长连接,做数据的实时更新,这种情况下我们就可以使用websocket做持久连接。http与...
    99+
    2024-04-02
  • Node.js Streams:高效处理数据流的强大工具
    Streams 在 Node.js 中有着广泛的应用场景,包括: 文件处理:Streams 可以用来读取和写入文件,这使得它们非常适合处理大型文件或流式传输文件。 网络通信:Streams 可以用来发送和接收网络数据,这使得它们非常适...
    99+
    2024-02-07
    Node.js Streams, data stream, streaming, data processing
  • Quartz.NET的具体使用
    目录一、什么是Quartz.NET?二、Quartz.NET可以做什么?三、ASP.NET Core如何使用Quartz.NET?四、Quartz的cron表达式一、什么是Quart...
    99+
    2024-04-02
  • JavaScheduledExecutorService的具体使用
    目录1. 延迟不循环任务schedule方法2. 延迟且循环cheduleAtFixedRate方法3. 严格按照一定时间间隔执行``ScheduledExecutorService...
    99+
    2023-05-19
    ScheduledExecutorService
  • QtQFrame的具体使用
    目录1.概述2.常用数据接口3.示例1.概述 void setFrameShape(Shape) QFrame继承QWidget,QFrame类是具有框架的小部件的基类,例如QLab...
    99+
    2024-04-02
  • python__add__()的具体使用
    __add__(),  同一个类,两个对象相加的实现逻辑,重写 + class Myclass(object): def __init__(self,value):...
    99+
    2023-02-27
    python __add__()使用 python __add__
  • C#中{get;set;}的具体使用
    在C#程序中经常会看到set,get的配套使用,很多人不知道它的用途。我就在这向大家讲讲,也加深一下自己的印象。 //这里有两个类 public class person1 { ...
    99+
    2023-02-06
    C# {get;set;} C# GET SET
  • SpringMVC中的http Caching的具体使用
    目录过期时间Last-ModifiedETagSpring ETag filterCache 是HTTP协议中的一个非常重要的功能,使用Cache可以大大提高应用程序的性能,减少数据...
    99+
    2024-04-02
  • Vue中this.$nextTick()的具体使用
    目录1、官网说法2、DOM 更新3、获取更新后的 DOM4、小结:this.$nextTick()的使用场景1、官网说法 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后...
    99+
    2023-02-06
    Vue this.$nextTick()
  • pythonhttpx的具体使用
    目录什么是 Httpx安装 Httpx发送 HTTP 请求发送异步 HTTP 请求设置请求标头设置请求参数发送请求体发送 JSON 数据设置超时错误处理证书验证使用代理上传文件使用 ...
    99+
    2023-05-14
    python httpx
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作