在`fetch()`上使用stream的优点是什么?

我试图使用OneDrive JS SDK下载文件,所以我使用了微软的代码:

// Download a file from OneDrive let fs = require('fs'); // requires filesystem module client .api('/me/drive/root/children/Book.xlsx/content') .getStream((err, downloadStream) => { if (err) { console.log(err); return; } let writeStream = fs.createWriteStream('../Book1.xlsx'); downloadStream.pipe(writeStream).on('error', console.log); }); 

因为我想让它在浏览器中工作(不仅仅是在Node中),所以我首先尝试了一些浏览器的stream库,但是没有任何工作。 最终,我只使用REST API和fetch() (SDK是REST API的封装)。

一个简单的fetch(url)做了这个工作。 所以我想知道,为什么MS要经过上面的所有stream代码的麻烦,当一条线可以做这个工作?

尤其是stream的performance好于fetch() 。 例如,当下载大文件的时候会获取冻结的应用程序,而stream不会? 还有其他的区别吗?

stream更加高效,不止一种方式。

您可以执行即时处理。

例如,如果您有一系列要执行处理的数据,并且它位于远程位置,则使用stream将允许您在数据stream动时对数据执行处理,因此您可以执行处理和下载平行

这比等待数据下载更有效率,然后在下载之后,您就可以一次处理所有数据。

stream消耗更less的内存。

如果你想下载一个1GB的文件而不使用数据stream,你将需要消耗1GB的内存,因为这个文件被下载到一个请求中,暂时存储在某个地方,比如一个variables,然后你开始读取这个variables以保存到一个文件中。 换句话说,在开始处理之前,您将所有数据存储在缓冲区中

相比之下,随着内容的到来,一个stream将会写入文件。 想象一下,一股水stream入了一个水jar。

AFAIK这是数据下载通常用Streams处理的主要原因。


话虽如此,在大多数情况下 – 除了文件下载和实时的东西 – 在通常的请求/响应scheme中使用stream是没有意义的。

stream处理通常是更复杂的实现和理由。

fetch没有被使用的原因是它是一个相对较新的实验技术。 它还需要成熟以获得广泛的采用。

也就是说,取DOES使用stream。

您可能想要使用这两种方法来分析您的应用程序,并查看哪个更快。 我会怀疑抓取对于较小的文件来说效果最好,而对于较大的文件来说,数据stream会更好。

这里有一个更详细的答案给你: 取stream