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

时间:2017-06-21 20:32:12

标签: javascript node.js fetch 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);
    });

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

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

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

2 个答案:

答案 0 :(得分:5)

Streams以更多方式提高效率。

您可以随时执行处理。

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

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

Streams消耗更少的内存。

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

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

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

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

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

答案 1 :(得分:0)

没有使用fetch的原因是它是一种相对较新的实验性技术。它仍然需要成熟才能获得广泛采用。

也就是说,fetch DOES使用流。

您可能希望使用这两种方法分析您的应用,并了解哪种方法更快。我怀疑fetch对于较小的文件最有效,而对于较大的文件,stream会更好。

这是一个更详细的答案: Fetch stream