44

nodejs 是否有任何标准输出刷新,就像 python 或其他语言一样?

sys.stdout.write('some data')

sys.stdout.flush()

现在我只看到process.stdout.write()了nodejs。

4

4 回答 4

23

process.stdout是一个WritableStream对象,并且该方法会WritableStream.write()自动刷新流(除非它被明确地塞住)。但是,如果刷新成功,它将返回 true,如果内核缓冲区已满且无法写入,则返回 false。如果你需要连续写几次,你应该处理drain事件。

参阅write.

于 2012-09-20T10:40:35.413 回答
10

在较新的 NodeJS 版本中,您可以将回调传递给.write(),一旦刷新数据就会调用该回调:

sys.stdout.write('some data', () => {
  console.log('The data has been flushed');
});

.write()这与检查结果并注册到drain事件完全相同:

let write = sys.stdout.write('some data');
if (!write) {
  sys.stdout.once('drain', () => {
    console.log('The data has been flushed');
  });
}
于 2016-09-20T23:33:47.583 回答
3

true如果数据已被刷新,则write返回。如果它返回false,您可以等待 'drain' 事件。

我认为没有flush,因为那将是一个阻塞操作。

于 2012-09-20T10:40:16.367 回答
0

还有另一个功能stdout可以清除终端的最后输出,这有点像flush

function flush() {
    process.stdout.clearLine();
    process.stdout.cursorTo(0);
}

var total = 5000;
var current = 0;
var percent = 0;
var waitingTime = 500;
setInterval(function() {
    current += waitingTime;
    percent = Math.floor((current / total) * 100);
    flush();
    process.stdout.write(`downloading ... ${percent}%`);
    if (current >= total) {
        console.log("\nDone.");
        clearInterval(this);
    }
}, waitingTime);

cursorTo将光标移动到0作为起点的位置

使用flush之前的功能,stdout.write因为它会清除屏幕,如果你把你不会看到任何输出

于 2017-08-23T09:15:41.910 回答