【问题标题】:nodejs streams vs callbacksnodejs 流与回调
【发布时间】:2012-09-08 18:26:48
【问题描述】:

我正在阅读这篇文章: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();
});

我何时或为什么要使用流?

【问题讨论】:

    标签: node.js stream


    【解决方案1】:

    您在处理大文件时会使用流。使用回调,所有文件的内容必须一次加载到内存中,而使用流,在任何给定时间只有文件的一部分在内存中。

    此外,流接口可以说更优雅。除了显式附加datadrainend 回调之外,您还可以使用pipe

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

    【讨论】:

      【解决方案2】:

      一个重要的原因是您可以在数据全部进入内存之前就开始对其进行处理。想想“流媒体视频”,您可以在其中开始观看仍在加载的剪辑。在许多用例中,流将允许您在加载整个内容之前开始处理文件中的数据。

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

      显然还有很多更复杂的用例,而且在很多情况下,为了简单起见,回调仍然更有意义(例如,如果您需要计算“兔子”出现的总次数,在这种情况下,您必须无论如何都要加载整个文件)。

      【讨论】:

        猜你喜欢
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-03
        • 1970-01-01
        • 2021-09-26
        • 2015-11-16
        • 2017-05-14
        • 1970-01-01
        相关资源
        最近更新 更多