为什么 Streams API 改变了 Web 开发者的游戏规则
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《为什么 Streams API 改变了 Web 开发者的游戏规则》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
我们首先解释一下数据是如何通过网络发送的。它不是作为单个连续流发送的;相反,它被分成更小的块。在接收端,消费者或应用程序负责在收到所有数据后以正确的顺序和格式重新组装这些块。对于图像、视频和其他相对较大的数据类型,此过程会自动发生。

因此 streams api 提供的是一种无需等待完整数据可用的方法
- 在消费者阶段以块的形式接收数据时实时处理数据,这在处理大量数据(如我在本文中展示的示例)时非常有用且至关重要。
- 它还允许您将我们的数据视为流,当您想要发送特定类型的块时,这在后端非常有用,而当您使用类似的工作人员通过网络发送大文件时,这在前端非常有用”
修订文本:“streams api 提供的是一种在数据到达时处理数据的方法,而不是等待整个数据集可用。以下是两个主要优点:
- 实时数据处理:它允许您实时处理分块接收的数据。在处理大量数据时,例如我将在本文中讨论的示例,此功能至关重要。 (本文重点关注第一部分)
- 基于流的数据管理:streams api 使您能够将数据视为连续流。这对于后端以特定块发送数据以及在前端使用 web worker 高效上传大文件非常有用。
让我们首先比较使用 fetch api 接收数据的传统方法与新的 streams api 方法。
使用 fetch api 的传统方法
fetch("url") .then((response) => {
// note that there is a middle step before we receive the final data
// let's see what we actually receive
console.log(response.body); return response.text(); }) .then((data) => { // perform operations with the data
});
在此示例中,response.body 是一个 readablestream 对象:
readablestream { locked: false, state: 'readable', supportsbyob: true }
在这里,我们遇到了 streams api 的第一个组件:readablestream。 readablestream 构造函数创建并返回一个可读的流对象,这使我们能够更有效地处理流数据。我们可以使用这个构造函数来管理数据块,而不是等待整个数据集可用。
{ arraybuffer(): promise<arraybuffer>; blob(): promise<blob>; formdata(): promise<formdata>; json(): promise<any>; text(): promise<string>; }
我们需要实现一个函数来处理对象以访问实时发送的数据。这个函数应该:
1 接收 readablestream 作为承诺。
- 等待接收所有数据块。
- 将块合并到完整数据集中。返回完整数据作为承诺。

深入 readablestream
interface readablestream<r = any> {
readonly locked: boolean;
cancel(reason?: any): promise<void>;
getreader(options: { mode: "byob" }): readablestreambyobreader;
getreader(): readablestreamdefaultreader<r>;
getreader(options?: readablestreamgetreaderoptions): readablestreamreader<r>;
pipethrough<t>(
transform: readablewritablepair<t, r>,
options?: streampipeoptions
): readablestream<t>;
pipeto(
destination: writablestream<r>,
options?: streampipeoptions
): promise<void>;
tee(): [readablestream<r>, readablestream<r>];
}
interface readablestreamdefaultreader<r = any>
extends readablestreamgenericreader {
read(): promise<readablestreamreadresult<r>>;
releaselock(): void;
}
为了使用流,我们使用 getreader() ,它返回一个 readablestreamdefaultreader。
下面是一个示例,我们向 lichess.org 的 api 向某个用户请求 pgn 格式(将其视为文本)的游戏。最终结果应该以文本形式呈现。
fetch("https://lichess.org/api/games/user/gg").then((response) => {
console.log(response);
const readablestream = response.body;
console.log(readablestream);
const reader = readablestream.getreader();
console.log(reader);
});
输出:
readablestream { locked: false, state: 'readable', supportsbyob: true } readablestreamdefaultreader { stream: readablestream { locked: true, state: 'readable', supportsbyob: true }, readrequests: 0, close: promise { <pending> } }
请注意,您不能同时拥有多个读取器,因为如果 readablestream.locked = true,getreader() 将抛出错误,因此如果您想更改读取器,您必须首先使用 readablestreamdefaultreader 释放锁定。释放锁()
fetch("https://lichess.org/api/games/user/gg").then((response) => {
const readablestream = response.body;
console.log(readablestream);
const reader = readablestream.getreader();
console.log(reader);
try {
reader.releaselock();
const reader2 = readablestream.getreader();
// won't throw an error
const reader3 = readablestream.getreader();
// will throw an error
} catch (e) {
console.error(e.message);
// invalid state: readablestream is locked
}
});
现在我们在阅读器中使用 read 函数,它有两个变量
- value:在 uintarray 中包含当前块内容,我们可以通过将每个 int 转换为 char 并合并或简单地使用 textdecoder().decode() 将其转换为字符串
let string = result.push(
value.reduce((p, c) => {
return p + c.fromcharcode();
}, "")
); // or
let string = new textdecoder().decode(value);
// both achieve the same thing converting uint8array to string
完整代码示例
- 这是处理流和合并块的完整示例:
fetch("https://lichess.org/api/games/user/gg")
.then((response) => {
return new promise((resolve, reject) => {
const readablestream = response.body;
const reader = readablestream.getreader();
let result = [];
reader.read().then(function handlechunks({ done, value }) {
if (done) {
resolve(result);
return;
}
const pgn = new textdecoder().decode(value);
result.push(pgn);
reader.read().then(handlechunks);
});
});
})
.then((result) => {
console.log(result);
});
// console.log(value)
uint8array(551) [
91, 69, 118, 101, 110, 116, 32, 34, 82, 97, 116, 101,
100, 32, 98, 108, 105, 116, 122, 32, 103, 97, 109, 101,
34, 93, 10, 91, 83, 105, 116, 101, 32, 34, 104, 116,
116, 112, 115, 58, 47, 47, 108, 105, 99, 104, 101, 115,
115, 46, 111, 114, 103, 47, 90, 122, 78, 66, 90, 119,
100, 71, 34, 93, 10, 91, 68, 97, 116, 101, 32, 34,
50, 48, 50, 48, 46, 48, 49, 46, 49, 48, 34, 93,
10, 91, 87, 104, 105, 116, 101, 32, 34, 86, 101, 101,
118, 101, 101, 50,
... 451 more items
]
// console.log(new textdecoder().decode(value))
[event "rated blitz game"]
[site "https://lichess.org/zznbzwdg"]
[date "2020.01.10"]
[white "veevee222"]
[black "gg"]
[result "0-1"]
[utcdate "2020.01.10"]
[utctime "20:21:02"]
[whiteelo "1858"]
[blackelo "1863"]
[whiteratingdiff "-6"]
[blackratingdiff "+35"]
[variant "standard"]
[timecontrol "180+0"]
[eco "c00"]
[termination "normal"]
1. e4 e6 2. d4 d6 3. c4 Nf6 4. Nc3 c5 5. f4 cxd4 6. Qxd4 Nc6 7. Qd1 b6 8. g3 Bb7 9. Bg2 Rc8 10. Nf3 Be7 11. O-O O-O 12. b3 Nb4 13. Bb2 a5 14. Re1 Qc7 15. a3 Na6 16. Rc1 Nc5 17. Qd4 Nxb3 18. Qd1 Nxc1 19. e5 0-1
例如链接
例如,完整代码请

现在,我们可以在游戏通过网络发送的 pgn 时逐步访问它们。例如,如果我们在网站 ui 中使用已加载的游戏,则用户无需在空白或加载屏幕前等待,直到所有游戏都加载完毕。相反,数据可以逐步显示,从用户体验的角度来看,这要好得多。
例如完整代码请移至此处
今天关于《为什么 Streams API 改变了 Web 开发者的游戏规则》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!
Nodejs 版本管理器终极指南:NVM、NVS、fnm、Volta 和 asdf |第 1 部分
- 上一篇
- Nodejs 版本管理器终极指南:NVM、NVS、fnm、Volta 和 asdf |第 1 部分
- 下一篇
- 怎么在Windows11上安装适用于Linux的Windows子系统
-
- 文章 · 前端 | 4分钟前 |
- VB运行HTML的步骤及方法详解
- 337浏览 收藏
-
- 文章 · 前端 | 5分钟前 | flex flex-grow CSSFlexbox flex-basis flex-shrink
- CSSFlex子元素属性全解析
- 492浏览 收藏
-
- 文章 · 前端 | 6分钟前 | JavaScript 算法 链表 图 树
- JavaScript链表树图算法实现详解
- 357浏览 收藏
-
- 文章 · 前端 | 8分钟前 |
- 行高过高的排版问题怎么解决
- 339浏览 收藏
-
- 文章 · 前端 | 13分钟前 |
- 浏览器API通知功能实现方法
- 235浏览 收藏
-
- 文章 · 前端 | 19分钟前 |
- JS前端优化20个实用技巧分享
- 305浏览 收藏
-
- 文章 · 前端 | 28分钟前 |
- z-index作用及使用场景解析
- 420浏览 收藏
-
- 文章 · 前端 | 31分钟前 | 性能优化 无限滚动 scroll事件 IntersectionObserverAPI 哨兵元素
- HTML5无限滚动优化监听技巧
- 383浏览 收藏
-
- 文章 · 前端 | 34分钟前 |
- JavaScript实现i18n与l10n教程
- 324浏览 收藏
-
- 文章 · 前端 | 43分钟前 | 水平居中 FLEXBOX 导航栏 display:flex justify-content
- CSS导航栏居中无效?Flexbox组合解决方法
- 192浏览 收藏
-
- 文章 · 前端 | 43分钟前 |
- WebGL像素绘制技巧:顶点属性与调用解析
- 287浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3194次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3407次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3437次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4545次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3815次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 优化用户界面体验的秘密武器:CSS开发项目经验大揭秘
- 2023-11-03 501浏览
-
- 使用微信小程序实现图片轮播特效
- 2023-11-21 501浏览
-
- 解析sessionStorage的存储能力与限制
- 2024-01-11 501浏览
-
- 探索冒泡活动对于团队合作的推动力
- 2024-01-13 501浏览

