Как я могу использовать readline синхронно?
Я просто пытаюсь дождаться, пока пользователь введет пароль, а затем использовать его, прежде чем перейти к остальной части моего кода. Ошибка Cannot read property 'then' of undefined
.
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Password: ', password => {
rl.close();
return decrypt(password);
}).then(data =>{
console.log(data);
});
function decrypt( password ) {
return new Promise((resolve) => {
//do stuff
resolve(data);
});
}
2 ответа:
Функция Readline
question()
не возвращает обещание или результат функции arrow. Таким образом, вы не можете использоватьthen()
с ним. Вы могли бы просто сделатьrl.question('Password: ', (password) => { rl.close(); decrypt(password).then(data => { console.log(data); }); });
Если вам действительно нужно построить цепочку с обещанием, вы можете составить свой код по-другому:
new Promise((resolve) => { rl.question('Password: ', (password) => { rl.close(); resolve(password); }); }).then((password) => { return decrypt(password); //returns Promise }).then((data) => { console.log(data); });
Вам, вероятно, не следует забывать о
.catch()
, в противном случае работает любое решение, выбор должен основываться на том, какой код будет легче читать.Вы можете посмотреть на пару дополнительных обещаний использования паттерны
И если вы боитесь использовать обратные вызовы и возможность обратного вызова ад. Вы можете проверить readline-sync package