Простой скрипт да / нет дает странное поведение - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь реализовать простой сценарий да / нет.

Функция запускается, затем пользователю предлагается ввести, запускать ли ее снова или нет.

Если пользователь вводит «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 голосов
/ 06 января 2019

Линия

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>
...