【发布时间】:2012-09-12 17:07:46
【问题描述】:
nodejs 是否有任何标准输出刷新,就像 python 或其他语言一样?
sys.stdout.write('some data')
sys.stdout.flush()
现在我只看到 process.stdout.write() 用于 nodejs。
【问题讨论】:
标签: node.js
nodejs 是否有任何标准输出刷新,就像 python 或其他语言一样?
sys.stdout.write('some data')
sys.stdout.flush()
现在我只看到 process.stdout.write() 用于 nodejs。
【问题讨论】:
标签: node.js
write 返回 true 如果数据已被刷新。如果它返回false,你可以等待'drain'事件。
我认为没有flush,因为那将是一个阻塞操作。
【讨论】:
process.stdout 是一个WritableStream 对象,WritableStream.write() 方法自动刷新流(除非它被显式阻塞)。但是,如果刷新成功,它将返回 true,如果内核缓冲区已满且无法写入,则返回 false。如果需要连续多次写入,应处理drain事件。
【讨论】:
true,只要数据被添加到缓冲区并且缓冲区中有一些空闲空间(缓冲区的总大小小于highWaterMark)。因此,这与刷新数据完全不同。数据甚至不在硬盘的缓存中,数据只是在程序的内存中。当callback 被触发时,数据会闪烁。 drain 事件只是表示缓冲区中出现了空闲空间。
在较新的 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');
});
}
【讨论】:
pause() 如果 !write 然后 resume() 一旦 drain 触发时才能正常工作,否则不管怎样,你只会长出一个巨大的背压堆......
process.stdout.write
还有另一个函数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 的位置,这是起点
在stdout.write之前使用flush函数,因为它会清除屏幕,如果你放在后面你将看不到任何输出
【讨论】:
write 将数据发送到程序空闲时刷新的缓冲区。