【问题标题】:What are the advantages of using a stream over `fetch()`?与 `fetch()` 相比,使用流有什么优势?
【发布时间】:2017-11-24 22:17:10
【问题描述】:

我尝试使用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 会冻结应用程序,而流不会?还有其他区别吗?

【问题讨论】:

  • 它不会“冻结”应用程序本身。但是,流允许增量处理文件(同时不需要将所有内容都保存在内存中)。它类似于与(错误伪代码)有关的其他问题:lines = ReadAllLines()('fetch')与while (line = ReadNextLine()) { .. }('stream')。或者可以与 XML DOM+query ('fetch') vs SAX ('steam') .. 处理进行比较。
  • 顺便说一句,fetch 确实以非常相似的方式支持流式传输。

标签: javascript node.js fetch onedrive node-streams


【解决方案1】:

流更有效率,不止一种方式。

您可以随时执行处理。

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

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

流消耗更少的内存。

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

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

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


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

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

【讨论】:

    【解决方案2】:

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

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

    您可能希望使用这两种方法来分析您的应用,并查看哪种方法更快。我怀疑 fetch 最适合较小的文件,而流对于较大的文件会更好。

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

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 2010-12-27
      • 2015-04-06
      • 2013-05-09
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多