一个简单的"是/否"脚本会产生奇怪的行为



我正在尝试实现一个简单的yes/no脚本。

一个函数运行,然后提示用户输入是否再次运行它。

如果用户输入"y",则应重复该过程。

如果用户输入"n",则该过程应终止。

如果两者都没有,那么问题应该重复。

这是我的代码:

function func(i) {
console.log(i);
ask(i + 1);
}
function ask(i) {
process.stdout.write("again (y/n)?");
process.stdin.on("data", function(data) {
process.stdin.end();
if (data.toString().trim() == "y")
func(i);
else if (data.toString().trim() != "n")
ask(i);
});
}
func(0);

不幸的是,这个过程总是在第二次提问时终止。

我试着去掉process.stdin.end()的部分,得到了一个非常奇怪的行为:

第一次输入"y"时,问题会被问一次,函数会运行一次。

第二次输入"y"时,问题会被问两次,函数会运行两次。

第三次输入"y"时,问题被问了三次,函数运行了三次。

此外,在某个时刻,我开始得到这个错误:

(节点:12336)MaxListenersException警告:检测到可能的EventEmitter内存泄漏。增加了11个数据侦听器。使用发射器.setMaxListeners()增加限制

这里可能发生了什么?

process.stdin.end();

阻止进一步的输入,并且(在这里)有效地结束程序。所以,一旦一切都完成了,你只想称它为一次

process.stdin.on

当用户按下"enter"时,命令会向添加一个侦听器。如果您多次调用此函数,将添加多个侦听器。

因此,您可以考虑只添加一个侦听器,如果响应为n:,则调用process.stdin.end();

let i = 0;
function func() {
console.log(i);
i++;
ask();
}
process.stdin.on("data", function(data) {
if (data.toString().trim() === "y")
func(i);
else if (data.toString().trim() === "n")
process.stdin.end();
else
ask();
});
function ask() {
process.stdout.write("again (y/n)?");
}
func();

输出示例:

PS D:Downloads> node foo.js
0
again (y/n)?
again (y/n)?
again (y/n)?y
1
again (y/n)?y
2
again (y/n)?
again (y/n)?y
3
again (y/n)?n
PS D:Downloads>

相关内容

  • 没有找到相关文章

最新更新