nodejs stream vs callbacks

时间:2012-09-16 02:30:26

标签: node.js stream

我正在阅读这篇文章:http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/并且在了解流程方面遇到了一些麻烦。

引用:

"Suppose we want to develop a simple web application
that reads a particular file from disk and send it to the browser.
The following code shows a very simple and naïve implementation
in order to make this happen."

所以代码示例如下:

var readStream = fileSystem.createReadStream(filePath);
readStream.on('data', function(data) {
    response.write(data);
});

readStream.on('end', function() {
    response.end();        
});

为什么我们可以简单地使用上述方法:

fs.readFile(filePath, function(err, data){
  response.write(data);
  response.end();
});

何时或为何使用流?

2 个答案:

答案 0 :(得分:13)

使用大型文件时,您会使用流。使用回调,所有文件的内容必须立即加载到内存中,而对于流,在任何给定时间只有一大块文件在内存中。

此外,流界面可以说更优雅。您可以改为使用pipe而不是明确附加datadrainend回调:

var readStream = fileSystem.createReadStream(filePath);
readStream.pipe(response);

答案 1 :(得分:5)

一个重要原因是,您可以在数据全部存储之前开始处理数据。想想“流媒体视频”,你可以在它仍在加载时开始观看剪辑。在许多用例中,流可以让您在加载整个文件之前开始处理文件中的数据。

另一个常见的用例是,在您检测到数据中的某些条件之前,您只想读取一个对象。假设你需要检查一个大文件是否包含“兔子”这个词。如果使用回调模式,则需要将整个文件读入内存,然后浏览该文件并检查该单词是否在内部。使用流,您可以检测文件第5行上的单词,然后您就可以关闭流,而无需加载整个内容。

显然有许多更复杂的用例,并且仍然有很多次回调仍然对简单性更有意义(例如,如果你需要计算“兔子”出现的总时间,在这种情况下你必须无论如何加载整个文件。)