2017-02-07 3 views
6

Я просто пытаюсь дождаться ввода пользователем пароля, а затем использовать его, прежде чем перемещаться по остальной части моего кода. Ошибка Cannot read property 'then' of undefined. question() функцияКак я могу использовать readline синхронно?

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); 
    }); 
} 
+1

Похоже, что 'rl.question' не возвращает обещание в vanilla Node.Js (я предполагаю, что вопрос касается node.js). Фактически, он ничего не возвращает, см. [Исходный код] (https://github.com/nodejs/node/blob/b869ecaacfdd218e1920f1545a88a4304efd0288/lib/readline.js#L217-L228). Поэтому я ожидаю, что на нем нет метода 'then'. Поэтому, если вам действительно нужно обещание, я думаю, вам придется его реализовать вручную. – yeputons

ответ

1

Readline в не возвращает Promise или результат функции стрелки. Таким образом, вы не можете использовать then(). Вы можете просто сделать

rl.question('Password: ', (password) => { 
    rl.close(); 
    decrypt(password).then(data => { 
     console.log(data); 
    }); 
}); 

Если вам действительно нужно, чтобы построить цепочку с Promise, вы можете составить свой код по-разному:

new Promise((resolve) => { 
    rl.question('Password: ', (password) => { 
     rl.close(); 
     resolve(password); 
    }); 
}).then((password) => { 
    return decrypt(password); //returns Promise 
}).then((data) => { 
    console.log(data); 
}); 

Вы, вероятно, не следует забывать и о .catch(), в противном случае либо решение работает, выбор должен основываться на том, какой код будет легче читать.

Вы можете посмотреть на пару дополнительных promise usage patterns

+0

Или async-q для обработки кода на основе обещания – slebetman

+0

Нет, вы никогда не должны использовать 'async.js' с обещаниями. Используйте вспомогательные функции из вашей библиотеки обещаний, ничего не основанных на обратном вызове. – Bergi

+0

@ Берги - вы правы; если вам нужно использовать Promises буквально, async.js - плохая идея, так как это все обратные вызовы. Я просто хотел указать на определенную семантику, но, может быть, это запутанно, а не полезно. Я сам создал пару монадических конструкций поверх Promise для решения недостающих функциональных возможностей в Promise/A +. Я отредактирую ответ, чтобы указать на более полезный ресурс. –

0

А если вы боитесь использовать обратные вызовы и возможность обратного вызова ад. Вы можете проверить readline-sync package

Смежные вопросы