【发布时间】: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