javascript - 为什么 fetch() 使用 ReadableStream 作为响应的主体?
问题描述
我正在学习 fetch() 并发现响应的主体使用了一种叫做 readableStream 的东西。根据我的研究,可读流允许我们在从服务器下载数据后开始使用数据(我希望我是正确的:))。就 fetch() 而言,可读流如何与 fetch() 一起使用,也就是说,我们无论如何都需要下载所有数据然后开始使用它。总的来说,我只是无法理解 fetch() 中可读流的意义,因此我需要你的帮助:)。
解决方案
这是一个场景:一个原始的 ASCII 艺术“视频播放器”。
为简单起见,假设此演示中的“视频”帧是 80 x 50 = 4000 个字符。您的视频“解码器”读取 4000 个字符,在 80 x 50 网格中显示字符,再读取 4000 个字符,依此类推,直到数据完成。
一种方法是使用 发送一个 GET 请求fetch
,将整个正文作为一个非常长的字符串,然后开始显示。因此,对于一个 100 帧的“视频”,它会在向用户显示第一帧之前接收 400,000 个字符。
但是,为什么用户必须等待最后一帧发送,才能查看第一帧?相反,仍然使用fetch
,一次从ReadableStream
响应内容中读取 4000 个字符。您甚至可以在剩余数据到达客户端之前读取这些字符。
潜在地,您可以在客户端中的流开始处处理数据,甚至在服务器开始处理流结束处的数据之前。
潜在地,流甚至可能没有定义的结束(例如,考虑流广播电台)。
在很多情况下,使用流数据比吞下整个响应更好。一个简单的例子是对来自某个数据源的一长串数字求和。你不需要一次在内存中的所有数字来实现这一点——你只需要一次读取一个,将它添加到总数中,然后丢弃它。
推荐阅读
- javascript - 使用 NextJS 将变量动态添加到外部 js 脚本
- office365 - 如何在 Outlook 365 插件上设置后台任务
- javascript - 如何在 JavaScript 中使用 API 动态创建 Datatable Editable?
- outlook-addin - Outlook-addin Office.AttachmentContent 界面不起作用
- c# - 在 C# 中使用 StateServer 时如何获取 Session Expire DateTime
- math - 改变 3D 世界相机的“向上方向”
- context-free-grammar - 是 L = {a^mb^nc^k | if (m=n) then (n=k) } CFL 与否?
- ninject - 如何删除重复的 Ninject 绑定?
- c++ - 在 Visual Studio 中编译 cpp 代码时出错
- c# - 在 EF 核心中具有唯一性的备用键和 HasIndex 之间的真正区别是什么?