Как я могу использовать 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() функция не возвращает обещание или результат функции стрелка. Таким образом, вы не можете использовать 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-пакет синхронизации