使用流相对于`fetch()`有什么优点?

问题描述 投票:0回答:3

我尝试使用 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 中),所以我首先尝试了一些浏览器的流库,但无法让任何东西工作。最终,我只使用 REST API 和

fetch()
(该 SDK 是 REST API 的包装器)即可使用它。

一个简单的

fetch(url)
就完成了这项工作。所以我想知道,为什么 MS 要经历上面所有流代码的麻烦,而一行就可以完成这项工作?

特别是流的性能比

fetch()
更好。例如,下载大文件时 fetch 是否会冻结应用程序,而 Streams 则不会?还有其他区别吗?

javascript node.js fetch onedrive node-streams
3个回答
6
投票

流在不止一种方面更加高效。

您可以随时进行处理。

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

这比等待数据下载,下载完成后就开始一次性处理要高效得多。

流消耗的内存要少得多。

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

相比之下,流将在内容到来时写入文件。想象一下一股水流流入一个罐子。

据我所知,这是数据下载通常使用 Streams 处理的主要原因。


话虽这么说,在大多数情况下 - 除了文件下载和实时内容之外 - 在通常的请求/响应方案上使用 Stream 没有任何意义。

流处理的实现和推理通常更加复杂。


0
投票

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

也就是说,fetch 确实使用流。

您可能想使用这两种方法来分析您的应用程序,看看哪种方法更快。 我怀疑 fetch 最适合较小的文件,而流则更适合较大的文件。

这里有更详细的答案给您: 获取流


0
投票

流式传输分块数据在以下情况下是有益的:

  • 您需要发送大数据
  • 处理这些数据需要时间,您可以在处理完数据后立即发送数据块
  • 您不希望连接关闭(由于超时)

在这种情况下,如果您可以在超时时间内发送每个块,那么连接将保持打开状态。从而更好地控制局势。

当需要长期连接且数据不频繁更新时,您还可以在服务器端使用心跳机制。

© www.soinside.com 2019 - 2024. All rights reserved.