2016-08-17 5 views
0

У меня есть две функции, которые могут принимать входные данные из CLI, используя process.stdin. Когда одна из функций завершена, принимая входные данные, аналогичная такая функция вызывается, но когда управление смещается к вызываемой функции, вызывающая функция все еще передается и выполняется, что порождает противоречивые результаты.Как полностью сместить управление выполнением от одной интерактивной функции к другой в nodejs

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

Одна вещь, которая появляется сразу, заключается в том, что вы подключаете несколько слушателей к событию data для stdin. Обратите внимание, что предыдущий слушатель в test() никуда не уходит, а второй - в test2(). Вы можете добиться некоторых улучшений, используя once(), который только один раз прослушивает событие, а затем снимает с себя. Но вы должны быть осторожны, как ведет себя русло возобновления (исследование этого).

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

Кроме того, можете ли вы рассказать нам, что именно вы пытаетесь сделать, чтобы мы могли помочь вам лучше. Теперь цель теряется в середине вложенных функций.

+0

спасибо @pspi. Поток, похоже, ведет себя хорошо. Меня беспокоит то, почему поток 'test()' все еще передавался, когда 'test2()' уже был вызван. Ваш ответ затронул мою озабоченность. Однако моя основная цель состояла в том, чтобы достичь этого [вопроса] (http://stackoverflow.com/questions/38892588/synchronous-code-execution-in-nodejs-with-the-reuse-of-a-function-accepting-inpu). Так как у меня не было никакого решения, я ответил на метод выше. – DeepakBilikere