-1

У меня на Node.JS есть программа, которая спаришвает: "Как тебя зовут?: ". Всё конечно работает, но после rl.question() у меня вызывается console.log() который после rl.question. Как мне сделать так, чтобы было всё по порядку?

Код:

const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

var input = readline.question('What's your name?: ', (name) => { readline.close(); return name; });

console.log(input);

Вывод:

What's your name?: underfined
(мой ввод.)
A_Br2H
  • 439
  • 2
  • 13

1 Answers1

2

Так как эта библиотека работает через функции обратного вызова callback то нужно код периписать следующим образом (имя функции конечно может быть любым, тут для ясности оставил) :

const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

readline.question('What's your name?: ', callback);

function callback(input){ readline.close(); console.log(input); }

Пример, с использованием функции для ввода значений. Для работы с асинхронными операциями используют async/await так как await не возможно запустить вне асинхронной функции они всегда идут вместе:

const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

// таким образом можно преобразовать callback в асинхронную функцию. const askQuestion = async( question ) => { return new Promise(resolve => { const callback = (input) => {

   // здесь можно добавить конвертацию в число если нужно
   // в функцию askQuestion передавать тип вторым параметром
   // c помощью switch можно обработать и другие типы.   

   resolve(input);
}
readline.question(`${question}: `, callback);

}) }

// переменные можно хранить в любом удобном виде и месте. let name =""; let age = 0;

const run = async() => { name = await askQuestion('What's your name?'); age = await askQuestion('How old are you?'); console.log(name, age); readline.close(); }

run()

Daniil Loban
  • 11,208