Я написал простую 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
Как можно заблокировать после первого вызова генерацию меню, подождать, пока будет выбрана опция и выполнить соответствующее действие, а затем вернуться к следующей итерации отображения меню?