js Stream API简单使用

news/2024/9/19 12:50:37/文章来源:https://www.cnblogs.com/caroline2016/p/18418146

ReadableStream

<script>// TextDecoder将字节转换为字符串,默认 utf-8 编码let uint8Array = new Uint8Array([72, 101, 108, 108, 111]);console.log(new TextDecoder().decode(uint8Array)); // Hellolet uint8Array1 = new Uint8Array([228, 189, 160, 229, 165, 189]);console.log(new TextDecoder().decode(uint8Array1)); // 你好let uint8Array2 = new Uint8Array([0, 72, 101, 108, 108, 111, 0]);let binaryString = uint8Array2.subarray(1, -1);console.log(new TextDecoder().decode(binaryString)); // Hello// TextEncoder将字符串转换为字节console.log(new TextEncoder().encode("Hello")); // Uint8Array 72,101,108,108,111//ReadableStream 可读取的二进制流// 数据被按序读入到许多小的片段,这些片段被称作分块(chunk)。分块可以是单个字节,也可以是某种更大的数据类型,例如特定大小的类型化数组。单个流的分块可以有不同的大小和类型。// 已放入到流中的分块称作已入队(enqueued)——这意味着它们已经在队列中排队等待被读取。流的一个内置队列跟踪了那些尚未读取的分块。// 流中的分块由一个 reader 读取——该数据处理过程一次只处理一个分块,允许你对其执行任何类型的操作。// 每个 reader 都有一个关联的 controller,用来控制流例如可以将流关闭。fetch("http://localhost:3000/html-demos/table.html").then((response) => response.body).then((rb) => {const reader = rb.getReader();return new ReadableStream({start(controller) {// 处理每一个数据块function push() {reader.read().then(({ done, value }) => {// 读取完全部数据块if (done) {console.log("done", done);controller.close();return;}// 获取数据value,并通过controller发送给浏览器controller.enqueue(value);console.log(done, value);push();});}push();},});}).then((stream) =>// 处理流数据new Response(stream, { headers: { "Content-Type": "text/html" } }).text()).then((result) => {console.log(result);});
</script>

WritableStream

<script> const list = document.querySelector("ul");function sendMessage(message, writableStream) {const defaultWriter = writableStream.getWriter();const encoder = new TextEncoder();const encoded = encoder.encode(message, { stream: true });encoded.forEach((chunk) => {defaultWriter.ready.then(() => {return defaultWriter.write(chunk);}).then(() => {console.log(chunk, "Chunk written to sink.");}).catch((err) => {console.log("Chunk error:", err);});});// 重新调用ready确保writer关闭前所有数据已写入defaultWriter.ready.then(() => {defaultWriter.close();}).then(() => {console.log("All chunks written");}).catch((err) => {console.log("Stream error:", err);});}const decoder = new TextDecoder("utf-8");// CountQueuingStrategy 接口提供了一个内置的、用于对分块进行计数的队列策略,可以在构造流的时候使用。const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });let result = "";// 一个可写流(Writable stream)是一个可以写入数据的数据终点const writableStream = new WritableStream({write(chunk) {return new Promise((resolve, reject) => {var buffer = new ArrayBuffer(1);var view = new Uint8Array(buffer);view[0] = chunk;var decoded = decoder.decode(view, { stream: true });var listItem = document.createElement("li");listItem.textContent = "Chunk decoded: " + decoded;list.appendChild(listItem);result += decoded;resolve();});},close() {var listItem = document.createElement("li");listItem.textContent = "[MESSAGE RECEIVED] " + result;list.appendChild(listItem);},abort(err) {console.log("Sink error:", err);},},queuingStrategy);sendMessage("Hello, world.", writableStream);
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799229.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SDK实现广播的流程

其中APP:application 指应用程序 SD:softdevice    指蓝牙协议栈 SCANNER: 指扫描设备您的资助是我最大的动力!金额随意,欢迎来赏!如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。如果,您希望更容易地发现我的新博客,不妨点击一下绿色通…

ZBlogPHP提示非法访问,验证码不显示,验证码报错

针对您在 ZBlogPHP 升级后遇到的问题,以下是解决步骤:定位文件位置使用 FTP 客户端或者通过您的虚拟主机控制面板中的文件管理器找到 zb_users 目录。 打开 c_option.php 文件。修改配置选项在 c_option.php 文件中找到如下两行配置:phpZC_LOGIN_CSRFCHECK_ENABLE => tru…

【Java】若依框架(RuoYi-master)——8.文件上传

若依框架的自带上传和下载功能,但需要我们进行恰当的操作(具体也可以参考示例和源码)。新建表格 新建一张学生信息表(这里的字段、文件路径、文件名称与改说明相关):DROP TABLE IF EXISTS `sys_student`; CREATE TABLE `sys_student` (`student_id` int NOT NULL AUTO_I…

STP

STP简介STP 背景 传统拓扑环境,设备与设备之间只存在单条链路进行连接,就会产生单点故障的问题,为了解决单点故障问题,进行冗余环境的部署,但是冗余环境又会产生很多问题,造成环路,环路中又存在其他的问题:广播风暴、帧的多个副本、MAC地址表不稳定等 STP作用 STP:生成…

牛客周赛60

A 困难数学题一个数异或其本身就是0,直接输出0就好 B 构造序列正负数要相邻,那最长的序列肯定是数量最多的数放第一个,例3a2b ,a baba,ba为一组,最后结果为少的数的两倍+最开始的那个数,特判两数相等情况点击查看代码 ll a, b;cin >> a >> b;if (a < b){sw…

Ros2- Moveit2- Subrame( 子坐标 )

子坐标是在CollisionObjects上定义的坐标。 它们可用于定义您放置在场景中的对象上的兴趣点,例如瓶子的开口、螺丝刀的尖端或螺丝的头部。它们可用于规划和编写机器人指令,例如“拿起瓶子,然后将开口移到水龙头的喷口下方”,或“拿起螺丝刀,然后将其放在螺丝头上方”。 编…

精简实用!一分钟搭建文件管理服务!

Dufs —— 一款多功能的实用文件服务器。不仅支持静态文件的托管服务,还具备文件上传、搜索以及访问控制等功能,并且兼容 WebDAV 协议,支持 HTTPS 加密连接,保障了数据传输的安全性。大家好,我是 Java陈序员。 今天,给大家介绍一款精简实用的文件托管服务,一分钟即可搭建…

微信小程序wx.request请求封装

config.js // 请求地址 const BASE_URL = "https://localhost:8080" const TIMEOUT = 10000export {BASE_URL,TIMEOUT }server.js 假设这里返回的数据结构为 {"code": 0,"msg": "提示信息","data": "返回数据" }当…

[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离

今天带来一款优秀的项目:个人博客系统源码 。 系统采用的流行的前后端分离结构,内含功能包括 "写博客文章",“修改博客文章”,“富文本编辑器”,“评论管理”“管理员角色”,“游客角色”,“文章标签”,“文章分类” 如果您有任何问题,也请联系小编,小编是…

99元阿里云服务器部署若依前后端分离版(ruoyi-vue)

1. 购买阿里云 最近阿里云推出99元套餐,相当划算,薅羊毛搞起 ->新老同享阿里云99一年系统选择centos 2. 安装JDKJDK >= 1.8 虽说推荐1.8版本,但毕竟有点老,我选的JDK17,安装过程如下: # 下载安装包 wget https://download.oracle.com/java/17/archive/jdk-17.0.1_l…

.NET 开源工业级移动端仓库管理系统

前言 在工业生产中,定制化的软件对于每个环节都至关重要。对于仓库管理,推荐一款开源的仓库管理系统(WMS)解决方案。 这款基于.NET 框架开发的移动应用,提供了全面的仓库操作、订单处理、主数据管理、数据分析及个人信息设置等功能,是工业仓库管理的有利助手。 项目介绍 …

Linux下eCal测试计划及进度记录

完整的源代码包:# 安装依赖 sudo apt-get install git cmake doxygen graphviz build-essential zlib1g-dev sudo apt-get install libhdf5-dev libprotobuf-dev libprotoc-dev protobuf-compiler sudo apt-get install libcurl4-openssl-dev libqwt-qt5-dev libyaml-cpp-dev…