Сегодня я представляю простой пример реализации последовательного ввода данных от пользователя с помощью 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
Вот собственно и всё.
Примечание и благодарность
- Этот код не идеален и его можно немного подрефакторить, но каких-то существенных плюшек это не принесёт, кроме удовлетворения
- Благодарю за некоторую помощь в реализации учасников Telegram-чата Node.js — русскоговорящее сообщество