簡體   English   中英

如何鏈接諾言並捕獲Node.js

[英]How do I chain promises and catch in Node.js

我正在嘗試根據收到的請求插入一個新文檔,這就是我正在嘗試執行的操作。

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無限期掛起,而不會還原之前所做的更新。

在將新文檔插入DB時出錯的情況下,使用還原功能可以很好地解決問題。

由於ref.function(value)后接帶有thenreturn k ,因此catch塊可能僅在ref.function拒絕promise和下面的塊中的錯誤(在ref.function之后)時捕獲錯誤。

.then((k)=>{ // invoke for computation
   return(k);
})

嘗試在ref.function Promise.resolve之前添加ref.function

 return Promise.resolve(
 () => {
   return ref.function(value);
 }).then(
 k => {
    ...
 }).catch(
 err => {
    updateDB.updateOne({query}).then((doc)=>{}) //revert back the update done earlier incase of error when invoked function has an error (2)
    callBack(err);
 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM