我试图使用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会冻结应用程序吗?还有其他差异吗?
答案 0 :(得分:5)
Streams以更多方式提高效率。
例如,如果您有一系列要执行处理的数据,并且它在远程位置使用流将允许您在数据流动时执行处理,因此您可以执行处理和下载,并行。
这比等待数据下载要高效得多,然后在下载之后开始一次性处理。
如果你想在不使用流的情况下下载1GB文件,你会消耗1GB内存,因为文件是在一个请求中下载的,暂时存储在某个地方,例如变量,然后你开始读取该变量以保存到文件。换句话说,在开始处理之前,将所有数据存储在缓冲区中
相反,当内容到来时,流将写入文件。想象一下,一股水流入水壶。
AFAIK这是数据下载通常由Streams处理的主要原因。
话虽如此,在大多数情况下 - 除了文件下载和实时内容之外 - 将Streams用于通常的请求/响应方案没有任何意义。
流处理通常更难以实现和推理。
答案 1 :(得分:0)
没有使用fetch的原因是它是一种相对较新的实验性技术。它仍然需要成熟才能获得广泛采用。
也就是说,fetch DOES使用流。
您可能希望使用这两种方法分析您的应用,并了解哪种方法更快。我怀疑fetch对于较小的文件最有效,而对于较大的文件,stream会更好。
这是一个更详细的答案: Fetch stream