如果您在Windows (至少8个)下运行Node.js中的以下脚本
const init = +new Date;
setInterval(() => {
console.log(+new Date - init);
}, 1000);
并拖动控制台窗口的滚动条,脚本的输出类似于
1001
2003 // long drag here
12368 // its result
13370
14372
看起来Node.js的事件循环在滚动过程中暂停了。同样的事情也应该发生在http
包中的异步操作上。因此,留下一个可见的终端窗口对正在运行的服务器是危险的。
如何更改代码以避免此类行为?
发布于 2018-01-10 16:21:00
滚动或选择文本时,NodeJS不会停止。将数据发送到stdout的唯一函数被暂停。在您的服务器中,您可以将日志数据发送到文件,这样您的服务器就不会停止。
例如,请参阅以下代码:
const init = +new Date;
var str=''
setInterval(() => {
x=(+new Date - init).toString();;
str+=x + '\n'
}, 1000);
setTimeout(function(){
console.log(str)
},5000)
我在前5秒内选择了文本,结果如下:
C:\me>node a
1002
2002
3002
4003
你可以看到没有“暂停”。
如您所见,第一个事件循环setInterval
没有停止,因为里面没有console.log
。
现在,当您使用输出文件进行日志记录时,您可以使用tail -f
查看实时日志。这将显示输出文件中的每个新行。
发布于 2018-01-04 11:46:00
当你在控制台中滚动或点击时,你的控制台实际上是暂停的,因为它正在进入选择模式。看看标题栏,当它暂停的时候,它可能会显示select。
要防止此行为,请编辑命令提示符的属性,并取消选择“快速编辑模式”。
发布于 2019-06-11 03:06:28
如果您想让您的console.log和console.error在所有平台上始终是异步的,可以使用fs.write
to fd1 (stdout)或fd2 (stderr)来实现。
const fs = require('fs')
const util = require('util')
// used by console.log
process.stdout.write = function write (str) {
fs.write(1, str, ()=>{})
}
// used by console.error
process.stderr.write = function write (str) {
fs.write(2, str, ()=>{})
}
https://stackoverflow.com/questions/48068773
复制相似问题