Я создаю модуль, чтобы получить опыт и сократить код. У меня есть фрагмент кода, который использует строку чтения в упрощенном виде, например var x = arkin.question("How old are you? ");. Readline не ждет ответа. Он производит это:
How old are you? undefined
Код:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
exports.question = function(q){
var response;
rl.setPrompt(q);
rl.prompt();
rl.on('line', (userInput) => {
response = userInput;
rl.close();
});
rl.on('close', () => {
return response;
});
}
Я называю это так:
var age = arkin.question("How old are you? ");
console.info(age);
Я пробовал использовать этот код:
rl.question(q, (userInput) => {
rl.close;
response = userInput;
return response;
});
Тем не менее, я получаю тот же результат. Заранее спасибо за помощь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


всякий раз, когда вы вызываете arki.question, он регистрирует прослушиватели событий .on ("line") и .on ("close"), а затем возвращается из функции. Что бы вы ни вернули из прослушивателя событий .on ("close"), функция question не знает об этом, потому что этого больше нет в стеке вызовов. вы можете использовать обратный вызов или обещания с async...await, чтобы получить результат.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
exports.question = function(q , cb ){
var response;
rl.setPrompt(q);
rl.prompt();
rl.on('line', (userInput) => {
response = userInput;
rl.close();
});
rl.on('close', () => {
return cb(response);
});
};
ты называешь это так
var age = arki.question("how old are you? ", resp => {
console.info(resp);
});
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
exports.question = function(q){
var response;
rl.setPrompt(q);
rl.prompt();
return new Promise(( resolve , reject) => {
rl.on('line', (userInput) => {
response = userInput;
rl.close();
});
rl.on('close', () => {
resolve(response);
});
});
};
ты называешь это так
arki.question("how old are you? ").then( response => console.info(response) );
или
; ( async () => {
console.info(await arki.question("how old are you? "));
})();
вы должны поместить const r1 = readline.createInterface (...) в функцию вопроса, иначе она будет работать только в первый раз.
Хорошо, теперь я понимаю, но сделать это так же сложно, как и использовать в обычном режиме. Спасибо за вашу помощь!