使用流而不是`fetch()`有什么好处?

lau*_*ent 1 javascript fetch node.js onedrive node-streams

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

// 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);
    });
Run Code Online (Sandbox Code Playgroud)

因为我想让它在浏览器中工作(不仅仅是在Node中),我首先尝试了一些用于浏览器的流lib但却无法正常工作.最后,我得到了它只使用REST API和fetch()(SDK是REST API的包装器).

一个简单fetch(url)的工作.所以我想知道,为什么MS在单行完成工作时会遇到上述所有流代码的麻烦?

特别是流的表现比某种方式更好fetch().例如,在下载大文件时,fetch会冻结应用程序吗?还有其他差异吗?

Nik*_*des 5

流不仅仅是一种方式,效率更高.

您可以随时执行处理.

例如,如果您有一系列的数据要执行的处理,并使用流将让你在它流对数据进行处理,因此,你可以做加工和下载,是在一个远程位置在- 平行的.

这比等待数据下载要高效得多,然后在下载之后开始一次性处理.

流消耗的内存要少得多.

如果你想在不使用流的情况下下载1GB文件,那么你将消耗1GB内存,因为文件是在一个请求中下载的,暂时存储在某个地方,例如变量,然后你开始读取该变量以保存到文件中.换句话说,在开始处理之前,将所有数据存储在缓冲区中

相反,当内容到来时,流将写入文件.想象一下,一股水流入水壶.

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


话虽如此,在大多数情况下 - 除了文件下载和实时内容之外 - 使用Streams而不是通常的请求/响应方案没有任何意义.

流处理通常更难以实现和推理.