Сегодня я представляю простой пример реализации последовательного ввода данных от пользователя с помощью Promises на Node.js.


Итак начну с конца, т.е. исходного кода:

const readline = require('readline')

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

const question = (name, rl) => () => new Promise(resolve => {
  rl.question(`Введите ${name}: `, resolve)
})

const answers = {
  login:    '',
  phone:    '',
  password: ''
}

const setAnswer = name => answer => {
  answers[name] = answer
}

const askLogin    = question('login', rl)
const askPhone    = question('phone', rl)
const askPassword = question('password', rl)

askLogin()
.then(setAnswer('login'))
.then(askPhone)
.then(setAnswer('phone'))
.then(askPassword)
.then(setAnswer('password'))
.then(() => {

  // DO WHAT YOU WANT HERE

  rl.close()
})

Это скрипт получения ключа авторизации для ВК, который потом используется в чат боте для ВК. Давайте разберём его по порядку: Самая суть начинается с этой функции:

const question = (name, rl) => () => new Promise(resolve => {
  rl.question(`Введите ${name}: `, resolve)
})

Эта функция яркий пример одного из основных принципов программирования - DRY (Don't repeat yourself). Здесь я создаю базовую функцию которая будет запрашивать у пользователя переменную которую мы в будущем определим. Она возвращает функцию, которая возвращает промис, который собственно и запрашивает у пользователя данные на ввод с помощью стандартного интерфейса Node.js - readline (документация). В качестве resolve-функции в нём используется функция которая записывает ответы юзера в объект. Функция — суть этого решения, которое позволит нам потом удобно и наглядно запросить пользовательский ввод. Далее мы создаём пачку функций для ввода уже конкретных переменных:

const askLogin = question('login', rl)
const askAppId = question('password', rl)
//...и так далее

А затем сразу же создаём цепочку их вызовов не забывая при этом записывать их результаты в answers

Вот собственно и всё.

Примечание и благодарность