Как полностью перенести управление выполнением из одной интерактивной функции в другую в nodejs

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

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 ответ

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

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

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

Другие вопросы по тегам