Как вызвать меню Inquirer. js в Al oop с помощью Promises? - PullRequest
0 голосов
/ 25 апреля 2020

Я написал простую Node.js программу с удобной системой меню, облегченной запросчиком. js. Однако после выбора опции в меню и выполнения некоторых действий программа завершает работу. Мне нужно, чтобы меню показывалось снова, пока я не выбрал пункт Выход [последний] в меню. Я хотел бы сделать это, используя Promise, вместо async / await.

Я попытался использовать функцию, чтобы показать меню, и вызвал эту функцию навсегда l oop (Например, while (true) { ... }), но это сделало программу непригодной для использования. Я изменил это на for-l oop, просто чтобы посмотреть на проблему. Ниже приведена простая программа и полученный результат.

PROGRAM

"use strict";

const inquirer = require('inquirer');
const util = require('util')

// Clear the screen
process.stdout.write("\u001b[2J\u001b[0;0H");

const showMenu = () => {
  const questions = [
    {
      type: "list",
      name: "action",
      message: "What do you want to do?",
      choices: [
        { name: "action 1", value: "Action1" },
        { name: "action 2", value: "Action2" },
        { name: "Exit program", value: "quit"}
      ]
    }
  ];
  return inquirer.prompt(questions);
};

const main = () => {
  for (let count = 0; count < 3; count++) {
    showMenu()
    .then(answers => {
      if (answers.action === 'Action1') {
        return Promise.resolve('hello world');
      }
      else if (answers.action === 'Action2') {
        return new Promise((resolve, reject) => {
          inquirer
            .prompt([
              {
                type: 'input',
                name: 'secretCode',
                message: "Enter a secret code:"
              }
            ])
            .then(answers => {
              resolve(answers);
            })
        });
      }
      else {
        console.log('Exiting program.')
        process.exit(0);
      }
    })
    .then((data) => { console.log(util.inspect(data, { showHidden: false, depth: null })); })
    .catch((error, response) => {
      console.error('Error:', error);
    });
  }
}

main()

OUTPUT

? What do you want to do? (Use arrow keys)
❯ action 1
  action 2
  Exit program ? What do you want to do? (Use arrow keys)
❯ action 1
  action 2
  Exit program ? What do you want to do? (Use arrow keys)
❯ action 1
  action 2
  Exit program (node:983) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 keypress listeners added to [ReadStream]. Use emitter.setMaxListeners() to increase limit

Как можно заблокировать после первого вызова генерацию меню, подождать, пока будет выбрана опция и выполнить соответствующее действие, а затем вернуться к следующей итерации отображения меню?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...