Javascript 为什么fetch()使用ReadableStream作为响应体?

Javascript 为什么fetch()使用ReadableStream作为响应体?,javascript,fetch,Javascript,Fetch,我正在学习fetch(),发现响应的主体使用了一种叫做readableStream的东西。根据我的研究,readable stream允许我们在从服务器下载数据后开始使用它(我希望我是正确的:)。就fetch()而言,可读流如何与fetch()配合使用,也就是说,我们无论如何都需要下载所有数据,然后开始使用它。总的来说,我无法理解fetch()中可读流的意义,因此我需要您的帮助:) 这里有一个场景:一个原始的ASCII艺术“视频播放器” 为简单起见,假设本演示中的“视频”帧为80 x 50=40

我正在学习fetch(),发现响应的主体使用了一种叫做readableStream的东西。根据我的研究,readable stream允许我们在从服务器下载数据后开始使用它(我希望我是正确的:)。就fetch()而言,可读流如何与fetch()配合使用,也就是说,我们无论如何都需要下载所有数据,然后开始使用它。总的来说,我无法理解fetch()中可读流的意义,因此我需要您的帮助:)

这里有一个场景:一个原始的ASCII艺术“视频播放器”

为简单起见,假设本演示中的“视频”帧为80 x 50=4000个字符。视频“解码器”读取4000个字符,以80 x 50的网格显示字符,再读取4000个字符,依此类推,直到数据完成

一种方法是使用
fetch
发送GET请求,将整个正文作为一个很长的字符串,然后开始显示。因此,对于100帧的“视频”,在向用户显示第一帧之前,它将接收400000个字符

但是,为什么用户必须等待发送最后一帧,然后才能查看第一帧?相反,仍然使用
fetch
,从
ReadableStream
响应内容中一次读取4000个字符。您可以在剩余数据到达客户端之前读取这些字符

很可能,您可以在客户机的流开始时处理数据,而服务器甚至还没有开始处理流结束时的数据

潜在地,流甚至可能没有定义的端点(例如,考虑流式无线电台)


在很多情况下,处理流式数据比处理整个响应更好。一个简单的例子是对来自某个数据源的一长串数字求和。您不需要一次读取内存中的所有数字,只需一次读取一个,将其添加到总数中,然后丢弃。

请求正文用于向服务器发送数据。“我们无论如何都需要下载所有数据,然后开始使用它”这是从服务器获取数据。您通常不必等待获取所有数据来处理它。例如,有流式JSON解析器,它允许您在接收到数组元素后(在接收其余元素之前)立即使用数组元素进行解析。@FelixKling,噢,我的天哪,我想说的是响应体“我们无论如何都需要下载所有数据,然后开始使用它”-谁说的?获取的内容不能是像HTML、XML或JSON这样的复杂数据结构。它可能只是简单的文本行,比如CSV,一旦它们到达,就可以很容易地一行一行地处理…可能是@wewq的重复。例如:谢谢你的详细回答,好的,用可读流完成,它的好处。关于response.json(),它在将数据解析为json后等待所有数据被接收。但无论如何,我们必须等到所有数据都被接收到,才能将其解析为json。也就是说,如果我们想以编程方式处理数据,我们需要将其解析为json,并且要解析它,我们需要等待整个数据被接收。这是真的吗?或者…?@wewq有流式处理JSON的库
bfj
是JS的一种。根据JSON的预期结构,这可能会带来挑战。但是,例如,如果您知道JSON将是一个长数组,那么一次可以使用一个数组元素
bfj
docs有很多例子。谢谢你的好意,我会去bfj看看,但是伙计,关于我的最后一个问题。是真的吗?:)@wewq不,不是真的。如果JSON看起来像
[{“name”:“Adam”},{“name”:“Joe”}]
流式解析器可以在读取“Joe”记录之前处理“Adam”记录。