一个简单的 yes/no 脚本会产生奇怪的行为
A simple yes/no script yields weird behavior
我正在尝试实现一个简单的 yes/no 脚本。
一个函数运行s,然后提示用户输入是否再次运行。
如果用户输入 "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",问题被问一次,函数运行s一次。
第二次输入"y",问题被问了两次,函数运行s被问了两次。
第三次输入"y",问题被问三次,函数运行s三次。
此外,有时我开始收到此错误:
(node:12336) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 data listeners added. Use emitter.setMaxListeners() to increase limit
这里可能发生了什么?
行
process.stdin.end();
阻止进一步输入,并且(此处)有效地结束程序。因此,一旦一切都完成,您将只想调用它 一次。
process.stdin.on
command 在用户按下 "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>
我正在尝试实现一个简单的 yes/no 脚本。
一个函数运行s,然后提示用户输入是否再次运行。
如果用户输入 "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",问题被问一次,函数运行s一次。
第二次输入"y",问题被问了两次,函数运行s被问了两次。
第三次输入"y",问题被问三次,函数运行s三次。
此外,有时我开始收到此错误:
(node:12336) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 data listeners added. Use emitter.setMaxListeners() to increase limit
这里可能发生了什么?
行
process.stdin.end();
阻止进一步输入,并且(此处)有效地结束程序。因此,一旦一切都完成,您将只想调用它 一次。
process.stdin.on
command 在用户按下 "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>