当前位置:首页 > 文章列表 > 文章 > 前端 > 为什么 Streams API 改变了 Web 开发者的游戏规则

为什么 Streams API 改变了 Web 开发者的游戏规则

来源:dev.to 2024-09-16 16:00:53 0浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《为什么 Streams API 改变了 Web 开发者的游戏规则》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

我们首先解释一下数据是如何通过网络发送的。它不是作为单个连续流发送的;相反,它被分成更小的块。在接收端,消费者或应用程序负责在收到所有数据后以正确的顺序和格式重新组装这些块。对于图像、视频和其他相对较大的数据类型,此过程会自动发生。

为什么 Streams API 改变了 Web 开发者的游戏规则

因此 streams api 提供的是一种无需等待完整数据可用的方法

  1. 在消费者阶段以块的形式接收数据时实时处理数据,这在处理大量数据(如我在本文中展示的示例)时非常有用且至关重要。
  2. 它还允许您将我们的数据视为流,当您想要发送特定类型的块时,这在后端非常有用,而当您使用类似的工作人员通过网络发送大文件时,这在前端非常有用”

修订文本:“streams api 提供的是一种在数据到达时处理数据的方法,而不是等待整个数据集可用。以下是两个主要优点:

  1. 实时数据处理:它允许您实时处理分块接收的数据。在处理大量数据时,例如我将在本文中讨论的示例,此功能至关重要。 (本文重点关注第一部分)
  2. 基于流的数据管理: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; blob(): promise; formdata(): promise; json(): promise; text(): promise; }

我们需要实现一个函数来处理对象以访问实时发送的数据。这个函数应该:
1 接收 readablestream 作为承诺。

  1. 等待接收所有数据块。
  2. 将块合并到完整数据集中。返回完整数据作为承诺。

为什么 Streams API 改变了 Web 开发者的游戏规则

深入 readablestream

interface readablestream {
  readonly locked: boolean;
  cancel(reason?: any): promise;
  getreader(options: { mode: "byob" }): readablestreambyobreader;
  getreader(): readablestreamdefaultreader;
  getreader(options?: readablestreamgetreaderoptions): readablestreamreader;
  pipethrough(
    transform: readablewritablepair,
    options?: streampipeoptions
  ): readablestream;
  pipeto(
    destination: writablestream,
    options?: streampipeoptions
  ): promise;
  tee(): [readablestream, readablestream];
}
interface readablestreamdefaultreader
  extends readablestreamgenericreader {
  read(): promise>;
  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 {  } }

请注意,您不能同时拥有多个读取器,因为如果 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

例如链接

例如,完整代码请

为什么 Streams API 改变了 Web 开发者的游戏规则

现在,我们可以在游戏通过网络发送的 pgn 时逐步访问它们。例如,如果我们在网站 ui 中使用已加载的游戏,则用户无需在空白或加载屏幕前等待,直到所有游戏都加载完毕。相反,数据可以逐步显示,从用户体验的角度来看,这要好得多。
例如完整代码请移至此处

今天关于《为什么 Streams API 改变了 Web 开发者的游戏规则》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
Nodejs 版本管理器终极指南:NVM、NVS、fnm、Volta 和 asdf |第 1 部分Nodejs 版本管理器终极指南:NVM、NVS、fnm、Volta 和 asdf |第 1 部分
上一篇
Nodejs 版本管理器终极指南:NVM、NVS、fnm、Volta 和 asdf |第 1 部分
怎么在Windows11上安装适用于Linux的Windows子系统
下一篇
怎么在Windows11上安装适用于Linux的Windows子系统
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    888次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    863次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    796次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    988次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    958次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码