在`fetch()`上使用stream的优点是什么?
我试图使用OneDrive JS SDK下载文件,所以我使用了微软的代码:
// 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中),所以我首先尝试了一些浏览器的stream库,但是没有任何工作。 最终,我只使用REST API和fetch()
(SDK是REST API的封装)。
一个简单的fetch(url)
做了这个工作。 所以我想知道,为什么MS要经过上面的所有stream代码的麻烦,当一条线可以做这个工作?
尤其是stream的performance好于fetch()
。 例如,当下载大文件的时候会获取冻结的应用程序,而stream不会? 还有其他的区别吗?
stream更加高效,不止一种方式。
您可以执行即时处理。
例如,如果您有一系列要执行处理的数据,并且它位于远程位置,则使用stream将允许您在数据stream动时对数据执行处理,因此您可以执行处理和下载平行 。
这比等待数据下载更有效率,然后在下载之后,您就可以一次处理所有数据。
stream消耗更less的内存。
如果你想下载一个1GB的文件而不使用数据stream,你将需要消耗1GB的内存,因为这个文件被下载到一个请求中,暂时存储在某个地方,比如一个variables,然后你开始读取这个variables以保存到一个文件中。 换句话说,在开始处理之前,您将所有数据存储在缓冲区中
相比之下,随着内容的到来,一个stream将会写入文件。 想象一下,一股水stream入了一个水jar。
AFAIK这是数据下载通常用Streams处理的主要原因。
话虽如此,在大多数情况下 – 除了文件下载和实时的东西 – 在通常的请求/响应scheme中使用stream是没有意义的。
stream处理通常是更复杂的实现和理由。
fetch没有被使用的原因是它是一个相对较新的实验技术。 它还需要成熟以获得广泛的采用。
也就是说,取DOES使用stream。
您可能想要使用这两种方法来分析您的应用程序,并查看哪个更快。 我会怀疑抓取对于较小的文件来说效果最好,而对于较大的文件来说,数据stream会更好。
这里有一个更详细的答案给你: 取stream