INOYAKAIGOR

Внимание! Сайт незапланированно сломался и вскорости я его починю. Местами он уже, вроде, работает.

Node.js: последовательный ввод данных от пользователя с использованием Javascript промисов


Запись от: 2017-05-04 19:32:00

   Сегодня я представляю простой пример реализации последовательного ввода данных от пользователя с помощью 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-функции в нём используется функция setAnswer которая записывает ответы юзера в объект answers. Функция qeustion - суть этого решения, которое позволит нам потом удобно и наглядно запросить пользовательский ввод. Далее мы создаём пачку функций для ввода уже конкретных переменных:

const askLogin = question('login', rl)
const askAppId = question('password', rl)
...и так далее
А затем сразу же создаём цепочку их вызовов не забывая при этом записывать их результаты в answers Вот собственно и всё.

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

  • Этот код не идеален и его можно немного подрефакторить, но каких-то существенных плюшек это не принесёт, кроме удовлетворения
  • Благодарю за некоторую помощь в реализации учасников Telegram-чата Node.js — русскоговорящее сообщество

Теги: node.js javascript es6 promise промисы readline 

Комментарии:



©Игорь InoY Звягинцев