如何在nodejs

时间:2016-08-17 09:59:51

标签: javascript node.js process synchronous

我有两个函数可以使用 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

我想在不使用任何外部软件包的情况下执行这条逻辑。 有人可以帮助我理解代码流并改进代码吗?

1 个答案:

答案 0 :(得分:0)

立即弹出的一件事是,您正在为data的{​​{1}}事件附加多个侦听器。请注意stdin中的前一个侦听器在test()附加第二个侦听器时不会移动到任何位置。您可以通过使用test2()来实现一些改进,once()仅监听事件一次,然后取消注册。但是你必须小心当前流恢复的行为(研究这个)。

process.stdin.once('data', ...)

另外,你能告诉我们你的目标是什么,所以我们可以帮助你。现在,在嵌套函数中迷失了目标。

相关问题