在node.js中`console.log`缓冲区输出吗?

时间:2014-12-17 15:37:30

标签: javascript node.js

我想知道console.log是否在node.js中缓冲输出或尝试在每次调用时执行IO?这似乎没有正式记录。

问题产生于输出字符串数组的必要性,我认为哪种成语更有效:

array.forEach(function(line){
  console.log(line)
})

console.log(array.join('\n'))

由于

1 个答案:

答案 0 :(得分:6)

console.log()的文档可能没有指定它是否缓冲输出,因为它delegates that decision to an underlying stream

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};

它使用的writable.write()记录了缓冲的一般可能性:

  

返回值表示您是否应该立即继续写作。如果必须在内部缓冲数据,则它将返回false。否则,它将返回true

     

此返回值严格提供咨询。你可以继续写,即使它返回false。但是,写入将缓冲在内存中,因此最好不要过度执行此操作。相反,在写入更多数据之前,请等待drain事件。

但是,全球console使用process.stdout更有可能阻止,只在某些情况下缓冲:

  

process.stderrprocess.stdout与Node中的其他流不同,因为对它们的写入通常是阻塞的。

     
      
  • 如果它们引用常规文件或TTY文件描述符,它们就会阻塞。
  •   
  • 在他们提到管道的情况下:   
        
    • 他们在Linux / Unix中阻塞。
    •   
    • 它们与Windows中的其他流一样无阻塞。
    •   
  •   

要查看是否缓存了任何line,您可以.write()将它们stdout转移到var util = require('util'); var buffered = []; array.forEach(function(line){ buffered.push(!process.stdout.write(util.format(line) + '\n')); }); console.log(buffered); 并获取返回值:

{{1}}