我有两个函数可以使用 process.stdin 接受来自CLI的输入。当其中一个函数完成接受输入数据时,调用类似的这样的函数,但是当控制转移到被调用函数时,调用函数仍被引用并执行,这会产生矛盾的结果。
var ar = [];
var a = 0;
test();
function test2(){
console.log("TEst 2");
process.stdin.setEncoding('utf8');
process.stdin.resume();
process.stdin.on('data',function(b){
if(ar.length < a)
{
ar.push(b.replace("\n",""));
}
else
{
test3();
}
});
}
function test3()
{
for(var t in ar)
{
console.log("ar["+t+"]: " + ar[t]);
}
process.exit();
}
function test()
{
process.stdin.setEncoding('utf8');
process.stdin.resume();
process.stdin.on('data',function(dat)
{
dat = dat.replace("\n","");
if(isNaN(dat))
{
console.log("This is an invalid number");
}
else
{
a = parseInt(dat);
console.log("calling test2");
test2();
}
});
}
test()
调用test2()
。每次在test2()
中接受数据时,此数据都会在isNaN
中针对test()
进行验证,并为任何非数字输入(有效数据)生成console.log("This is an invalid number");
。
请在下面找到结果。
deepakbilikere:~/workspace $ node goodnumber.js
2
calling test2
TEst 2
a
This is an invalid number
b
This is an invalid number
c
This is an invalid number
ar[0]: a
ar[1]: b
我想在不使用任何外部软件包的情况下执行这条逻辑。 有人可以帮助我理解代码流并改进代码吗?
答案 0 :(得分:0)
立即弹出的一件事是,您正在为data
的{{1}}事件附加多个侦听器。请注意stdin
中的前一个侦听器在test()
附加第二个侦听器时不会移动到任何位置。您可以通过使用test2()
来实现一些改进,once()
仅监听事件一次,然后取消注册。但是你必须小心当前流恢复的行为(研究这个)。
process.stdin.once('data', ...)
另外,你能告诉我们你的目标是什么,所以我们可以帮助你。现在,在嵌套函数中迷失了目标。