function recursiveAsyncReadLine(){
rl.question("name : ", function(answer) {
if(answer==="exit"){
rl.close();
}
var kitty = new Kitten({name : answer});
kitty.save(function(err, kitty){
if(err){
throw err;
}
kitty.speak();
Kitten.find(function(err, kittens){
if(err){
throw err;
}
console.log(kittens);
recursiveAsyncReadLine();
});
});
});
}
我试图用诺言改变上面的代码。
function recursiveAsyncReadLine(){
rl.question("name: ")
.then((answer)=>{
if(answer==="exit"){
rl.close();
}
var kitty = new Kitten({name : answer});
return kitty.save();
})
.then((kitty)=>{
kitty.speak();
return Kitten.find();
})
.then((kittens)=>{
console.log(kittens);
recursiveAsyncReadLine();
})
.catch((err)=>{
throw err;
});
}
但它不适用于消息
TypeError:无法读取未定义的属性'then'
第一个'then'语句出现错误。
我不确定我是否理解了Promise。我在哪里弄错了?
答案 0 :(得分:1)
你误解了这个承诺。你的r1.question函数目前没有返回一个promise。它宁可接受回调函数,然后继续执行异步执行
为了宣传它,您可以为r1.question创建一个包装函数,如下所示:---
var promisifiedr1 = new Promise(function(resolve, reject){
rl.question("name: ", function(answer){
resolve(answer);
})
});
promisifiedr1.then((answer)=>{
if(answer==="exit"){
rl.close();
}
var promisifiedkitty = new Promise(function(resolve, reject){
var kitty = new Kitten({name : answer});
kitty.save(function(err, kitty){
if(err){
throw err;
}
resolve(kitty);
});
promisifiedkitty.then((kitty)=>{
kitty.speak();
return Kitten.find();
})
.then((kittens)=>{
console.log(kittens);
recursiveAsyncReadLine();
})
.catch((err)=>{
throw err;
});
});
答案 1 :(得分:0)
看起来question()
不会返回承诺,而是会调用回调。在这种情况下,您可以使用promisify作为包装来获得承诺。
const util = require('util');
function recursiveAsyncReadLine(){
questionPromise = util.promisify(r1.question);
questionPromise("name: ")
.then((answer)=>{
if(answer==="exit"){
rl.close();
}
var kitty = new Kitten({name : answer});
return kitty.save();
})
.then((kitty)=>{
kitty.speak();
return Kitten.find();
})
.then((kittens)=>{
console.log(kittens);
recursiveAsyncReadLine();
})
.catch((err)=>{
throw err;
});
}