首页 > 其他分享 >为什么 Streams API 改变了 Web 开发者的游戏规则

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

时间:2024-09-21 16:36:30浏览次数:1  
标签:API Web getreader readablestream api Streams promise 101 response

我们首先解释一下数据是如何通过网络发送的。它不是作为单个连续流发送的;相反,它被分成更小的块。在接收端,消费者或应用程序负责在收到所有数据后以正确的顺序和格式重新组装这些块。对于图像、视频和其他相对较大的数据类型,此过程会自动发生。因此 streams api 提供的是一种无需等待完整数据可用的方法 在消费者阶段以块的形式接收数据时实时处理数据,这在处理大量数据(如我在本文中展示的示例)时非常有用且至关重要。它还允许您将我们的数据视为流,当您想要发送特定类型的块时,这在后端非常有用,而当您使用类似的工作人员通过网络发送大文件时,这在前端非常有用”修订文本:“streams api 提供的是一种在数据到达时处理数据的方法,而不是等待整个数据集可用。以下是两个主要优点:实时数据处理:它允许您实时处理分块接收的数据。在处理大量数据时,例如我将在本文中讨论的示例,此功能至关重要。 (本文重点关注第一部分)基于流的数据管理:streams api 使您能够将数据视为连续流。这对于后端以特定块发送数据以及在前端使用 web worker 高效上传大文件非常有用。让我们首先比较使用 fetch api 接收数据的传统方法与新的 streams api 方法。 使用 fetch api 的传统方法fetch("url") .then((response) =&gt; {// note that there is a middle step before we receive the final data// let's see what we actually receiveconsole.log(response.body); return response.text(); }) .then((data) =&gt; { // 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>; }</string></any></formdata></blob></arraybuffer>登录后复制我们需要实现一个函数来处理对象以访问实时发送的数据。这个函数应该:1 接收 readablestream 作为承诺。等待接收所有数据块。将块合并到完整数据集中。返回完整数据作为承诺。深入 readablestreaminterface 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>];}</r></r></void></r></t></t></t></r></r></void></r>登录后复制interface readablestreamdefaultreader<r any> extends readablestreamgenericreader { read(): promise<readablestreamreadresult>&gt;; releaselock(): void;}</readablestreamreadresult></r>登录后复制为了使用流,我们使用 getreader() ,它返回一个 readablestreamdefaultreader。下面是一个示例,我们向 lichess.org 的 api 向某个用户请求 pgn 格式(将其视为文本)的游戏。最终结果应该以文本形式呈现。fetch("https://lichess.org/api/games/user/gg").then((response) =&gt; { 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> } }</pending>登录后复制请注意,您不能同时拥有多个读取器,因为如果 readablestream.locked = true,getreader() 将抛出错误,因此如果您想更改读取器,您必须首先使用 readablestreamdefaultreader 释放锁定。释放锁()fetch("https://lichess.org/api/games/user/gg").then((response) =&gt; { 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) =&gt; { return p + c.fromcharcode(); }, "")); // orlet string = new textdecoder().decode(value); // both achieve the same thing converting uint8array to string登录后复制完整代码示例这是处理流和合并块的完整示例:fetch("https://lichess.org/api/games/user/gg") .then((response) =&gt; { return new promise((resolve, reject) =&gt; { 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) =&gt; { 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 开发者的游戏规则的详细内容,更多请关注我的其它相关文章!

标签:API,Web,getreader,readablestream,api,Streams,promise,101,response
From: https://www.cnblogs.com/aow054/p/18424174

相关文章

  • 为什么同步引擎可能是 Web 应用程序的未来
    在不断发展的web应用程序世界中,效率、可扩展性和无缝实时体验至关重要。传统的web架构严重依赖于客户端-服务器模型,这些模型可能难以满足现代对响应能力和同步的需求。这就是同步引擎发挥作用的地方,它为开发人员当今面临的许多挑战提供了一个有前景的解决方案。但同步引擎到底......
  • 书评:Eloquent JavaScript – Web 开发人员的基本指南
    作为最广泛使用的编程语言之一,JavaScript为网络提供了动力。然而,由于其快速发展,跟上JavaScript趋势可能具有挑战性。许多关于这个主题的书籍很快就会过时,但有一本书经受住了时间的考验:EloquentJavaScript。这本书已成为开发人员的最爱,并且正在稳步发展为那些希望加深对语言理......
  • 了解 API:应用程序如何通信:
    api(应用程序编程接口)是一组规则和定义,允许一个软件应用程序与另一个软件应用程序进行通信。它充当中介,通过定义不同的软件系统可以发出的请求类型、如何发出这些请求、数据格式以及系统应如何响应,使不同的软件系统能够相互交互。api中的关键概念端点:这些是api公开的特定......
  • 了解 CORS 在 Web 浏览器中的工作原理
    跨源资源共享(cors)是web浏览器中的一项重要安全功能,它控制web应用程序如何从与提供初始网页的域不同的域请求资源(例如数据、图像或脚本)。它的主要目的是保护用户免受试图访问其他网站上敏感信息的恶意网站的侵害。本博客将解释cors的工作原理以及为什么它对于web开发......
  • Webpack 系列第 3 部分
    请查找该系列的旧部分以充分理解这个概念。webpack5系列第1部分webpack5系列第2部分webpack5系列第4部分在线电子商店申请让我们使用微前端来构建一个在线商店应用程序以实现模块化。每个微前端将代表商店的不同部分,它们将共享公共库,例如react、设计系统和共享......
  • 【python】Panda 之Dataframe 基础api讲解代码 建议在Jupyter Notebook 中运行
    建议在JupyterNotebook中运行jupyternotebook环境搭建文章目录1.dataframe常用属性2.dataframe的常用方法3.dataframe对象的布尔值操作4.datafrane对象的计算5.更改series和dataframe对象5.2修改行名和列名5.3添加删除插入列6.导入和导出数据6.1导......
  • Web Development Job in 4
    简介网络开发领域持续快速发展,为拥有适当技能和知识的个人提供了令人兴奋的机会。如果您想进入这个充满活力的行业或提升自己的职业生涯,这里有一些重要策略可以帮助您在2024年找到梦想的工作:1.掌握基本技能编程语言:熟练掌握JavaScript、Python、Ruby或PHP等语言至关......
  • 电商数据驱动决策:京东商品详情API返回值的力量
    在电商领域,数据驱动决策的重要性日益凸显,而京东商品详情API提供了一个强大的工具,使得商家和开发者能够获取到丰富的商品信息,从而做出更加精准的市场判断和运营决策。京东商品详情API的力量京东商品详情API能够返回包括商品基本信息、价格变动、库存状态、用户评价、销售排行等在内......
  • 服务API接口:解锁API接口参数的奥秘
    在软件开发中,API接口参数是构建有效通信的核心。它们定义了API调用的方式和数据交换的规则,对于确保API的功能性和可用性至关重要。本文将深入探讨服务API接口中的参数,揭示如何通过精心设计的参数提升API的性能和用户体验。什么是API接口参数?API接口参数是在调用API时传递给API的数......
  • 使用 Nginx 搭建 Webdav 服务
    使用Nginx搭建Webdav服务一、自签名根证书1.生成根证书密钥opensslgenrsa-out./root.key20482.生成根证书opensslreq-x509-new-key./root.key-out./root.pem-days365交互信息CountryName(2lettercode)[]:CNStateorProvinceName(fullname)......