2017-02-07 25 views
6

Sadece bir kullanıcının bir şifre girmesini beklemeye çalışıyorum ve kodumun geri kalan kısmına geçmeden önce onu kullanıyorum. Hata, Cannot read property 'then' of undefined.Okuma hattını eşzamanlı olarak nasıl kullanabilirim?

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

'u kontrol edebilirsiniz. Rl.question'un vanilya Node.Js'de söz vermediği görülüyor (soru, node.js hakkında olduğunu varsayalım). Aslında hiçbir şey döndürmez, bkz. [Kaynak kodu] (https://github.com/nodejs/node/blob/b869ecaacfdd218e1920f1545a88a4304efd0288/lib/readline.js#L217-L228). Bu yüzden üzerinde 'o' yönteminin olmadığını beklerdim. Yani eğer gerçekten bir söze ihtiyacınız varsa, bunu elle uygulamak zorunda kalacağınızı düşünüyorum. – yeputons

cevap

1

Readline'ın question() işlevi Promise veya ok fonksiyonun sonucu döndürmez. Yani, then()'u onunla kullanamazsınız. Sadece farklı şekilde kodunuzu oluşturabilirsiniz

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

gerçekten Promise ile zinciri oluşturmak gerekiyorsa , yapabileceği:

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

Muhtemelen .catch() hakkında unutmamak gerekir, aksi takdirde her iki çözüm çalışır, seçim, hangi kodun okunmasının daha kolay olacağına dayanmalıdır.

Sen geri aramalar ve geri arama cehennem ihtimalini kullanarak korkuyor eğer ek promise usage patterns

+0

Ya da vaat tabanlı kod kullanımına ilişkin async-q – slebetman

+0

Hayır, hiçbir zaman async.js'yi hiçbir zaman vaatlerle kullanmamalısınız. Yardım işlevlerini, söz kitaplığınızdan geri arama temelli hiçbir şeyden kullanmayın. – Bergi

+0

@Bergi - haklısınız; Promises kelimesini tam anlamıyla kullanmak zorundaysanız, async.js kötü bir fikirdir, çünkü tüm geri dönüşler vardır. Ben sadece orada bazı semantiklere işaret etmek istedim, ama belki daha sonra yararlı kafa karıştırıcı olabilir. Kendim Promise/A + 'daki eksik işlevsellik ile başa çıkmak için Promise üzerine birkaç monadik yapı oluşturdum. Daha yararlı bir kaynağa işaret etmek için cevabı düzenleyeceğim. –

0

bir çift bakmak Ve isteyebilirsiniz.