2017-02-07 8 views
6

私は、ユーザーがパスワードを入力してからそれを使用して残りのコードを移動するのを待っているだけです。エラーはCannot read property 'then' of undefinedです。どのように同期して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のquestion()関数は、Promiseまたは矢印関数の結果を返しません。だから、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()を忘れてはなりません、どのコードを読みやすくするかに基づいて選択する必要があります。

あなたはコールバックや、コールバック地獄の可能性を使用しての怖がっている場合は、追加のpromise usage patterns

+0

または約束ベースのコードを扱うためのasync-q – slebetman

+0

いいえ、約束で 'async.js'を使用しないでください。約束のライブラリのヘルパー関数を使用します。何もコールバックに基づいていません。 – Bergi

+0

@Bergi - あなたは正しいです。文字通りプロミスを使用しなければならない場合、async.jsはすべてのコールバックなので、悪い考えです。私はちょうどそこにあるセマンティクスを指摘したかっただけですが、おそらくそれはむしろ助けになるのではないかと思います。私自身Promise/A +の欠けている機能に対処するために、Promiseの上にいくつかのモナド構造を作成しました。より有用なリソースを指すように答えを編集します。 –

関連する問題