1

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

4

2 回答 2

5

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

您可以随时执行处理。

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

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

流消耗的内存要少得多。

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

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

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


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

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

于 2017-06-21T20:38:07.503 回答
0

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

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

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

这是一个更详细的答案: 获取流

于 2017-06-21T21:08:28.263 回答