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

时间:2019-01-06 07:51:26

标签: node.js user-input stdin

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

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

如果用户输入“ 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”,问了三次,函数运行了三次。

此外,在某个时候我开始出现此错误:

(node:12336) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 data listeners added. Use emitter.setMaxListeners() to increase limit

任何人都可以对这里发生的事情有所了解吗?

关于如何进行这项工作的任何建议都会得到赞赏。

谢谢!

1 个答案:

答案 0 :(得分:2)

process.stdin.end();

防止进一步的输入,并且(在此)有效地结束程序。因此,一旦一切完成,您将只想一次

process.stdin.on

命令在用户按下“输入”时添加一个侦听器。如果您多次拨打此电话,则会添加多个侦听器。

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

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>