无法使用Promise

时间:2018-01-17 11:23:02

标签: javascript

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。我在哪里弄错了?

2 个答案:

答案 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;
    });
}