如何链接诺言并捕获Node.js

时间:2018-11-13 21:16:43

标签: javascript node.js mongodb mongoose

我正在尝试根据收到的请求插入新文档,这就是我正在尝试做的事情。

var function = (req,callBack)=>{
    queryDB.findOne({query}).then((result)=>{
        return(result); // see if requested object exists in DB and return if yes  
}).then((result)=>{
    if(condition:if required object exists){
        updateDB.updateOne({query}).then((result)=>{ //update required object with new values
            if(condition:update successful){
                ref.function(value).then((k)=>{ // invoke for computation
                    return(k);
                }).then((k)=>{
                    var document = new Document({ //create a new document 
                    ....
                    ....
                    ....
                    ....
                    ....
                    });

                    document.save().then((doc)={
                        callBack(doc); //return new document after successful insert
                    }).catch((err)=>{
                        updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error while inserting new document
                        callBack(err);
                    });
                }).catch((error)=>{
                    updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
                    callBack(err);
                })
            }
        }).catch((errorMessage)={
            callBack(errorMessage);
        })
    }else{
        callBack("Required Object Doesn't Exist");
    }
}).catch((errorMessage)=>{
    callBack(errorMessage);
})

}

我期望的行为是,如果ref.function中有错误,它应该还原更新并发回错误消息,但是API无限期挂起,而不会还原先前完成的更新。

在将新文档插入数据库时​​发生错误的情况下,还原操作可以正常工作。

1 个答案:

答案 0 :(得分:0)

由于ref.function(value)后跟带有then的{​​{1}},因此,return k块可能仅在catch拒绝承诺和错误时捕获错误。下面的代码块(ref.function之后)

ref.function

尝试在.then((k)=>{ // invoke for computation return(k); }) 之前添加Promise.resolve

ref.function