想象一下,您想下载图像或文件,这将是互联网教您继续前进的第一种方式:
request(url, function(err, res, body) {
fs.writeFile(filename, body);
});
但这不是将所有数据累积body
在内存中吗?会pipe
更有效吗?
request(url).pipe(fs.createWriteStream(filename));
或者这是在内部以类似的方式处理,无论如何缓冲流,使其无关紧要?
此外,如果我想使用回调而不是(body
因为你仍然可以 pipe
),这个内存缓冲区还会被填满吗?
我问是因为第一个(回调)方法允许我链接下载而不是并行启动它们(*),但我不想填充我也不会使用的缓冲区。因此,如果我不想诉诸诸如异步之类的花哨的东西只是为了使用队列来防止这种情况,我需要回调。
(*) 这很糟糕,因为如果request
在它们完成之前你的文件太多,那么异步特性request
将导致节点在过量事件和内存丢失中窒息而死。首先你会得到这些:
"possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit."
当拉伸它时,500 个管道请求将填满你的内存并崩溃节点。这就是为什么你需要回调而不是管道,所以你知道什么时候开始下一个文件。