Как я могу использовать 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 7

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