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

Ale*_*sha 7 javascript node.js

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

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

array.forEach(function(line){
  console.log(line)
})
Run Code Online (Sandbox Code Playgroud)

要么

console.log(array.join('\n'))
Run Code Online (Sandbox Code Playgroud)

谢谢

Jon*_*ski 6

该文档console.log()可能没有指定是否缓冲输出,因为它将该决策委托给基础流:

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

在writable.write()它的使用文件缓存的一般可能性:

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

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

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

process.stderr与process.stdoutNode中的其他流不同,写入它们通常是阻塞的.

  • 如果它们引用常规文件或TTY文件描述符,它们就会阻塞.
  • 在他们引用管道的情况下:
    • 它们在Linux/Unix中受阻.
    • 它们像Windows中的其他流一样是非阻塞的.

要查看是否任何lines的缓冲,可以.write()他们stdout自己和获取返回值:

var util = require('util');
var buffered = [];

array.forEach(function(line){
  buffered.push(!process.stdout.write(util.format(line) + '\n'));
});

console.log(buffered);
Run Code Online (Sandbox Code Playgroud)