How do I chain promises and catch in Node.js












0















I'm trying to insert a new document based on the request received and here's what I'm trying to do.



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


}



The behavior I'm expecting is if there is an error in ref.function it should revert the update and send back error message but the API hangs indefinitely without reverting back the update done prior.



While the revert back works fine in-case of error in inserting new document to DB.










share|improve this question























  • Do not use a callBack, return a promise instead. Try promise chaining to return a promise for the innermost result.

    – Bergi
    Nov 13 '18 at 21:26











  • What exactly is ref.function, and what is the error in it that causes this behaviour?

    – Bergi
    Nov 13 '18 at 21:40











  • @Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.

    – David
    Nov 14 '18 at 17:18













  • What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise .catch(), you will need a try block for that.

    – Bergi
    Nov 14 '18 at 17:34
















0















I'm trying to insert a new document based on the request received and here's what I'm trying to do.



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


}



The behavior I'm expecting is if there is an error in ref.function it should revert the update and send back error message but the API hangs indefinitely without reverting back the update done prior.



While the revert back works fine in-case of error in inserting new document to DB.










share|improve this question























  • Do not use a callBack, return a promise instead. Try promise chaining to return a promise for the innermost result.

    – Bergi
    Nov 13 '18 at 21:26











  • What exactly is ref.function, and what is the error in it that causes this behaviour?

    – Bergi
    Nov 13 '18 at 21:40











  • @Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.

    – David
    Nov 14 '18 at 17:18













  • What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise .catch(), you will need a try block for that.

    – Bergi
    Nov 14 '18 at 17:34














0












0








0








I'm trying to insert a new document based on the request received and here's what I'm trying to do.



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


}



The behavior I'm expecting is if there is an error in ref.function it should revert the update and send back error message but the API hangs indefinitely without reverting back the update done prior.



While the revert back works fine in-case of error in inserting new document to DB.










share|improve this question














I'm trying to insert a new document based on the request received and here's what I'm trying to do.



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


}



The behavior I'm expecting is if there is an error in ref.function it should revert the update and send back error message but the API hangs indefinitely without reverting back the update done prior.



While the revert back works fine in-case of error in inserting new document to DB.







javascript node.js mongodb mongoose






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 13 '18 at 21:16









DavidDavid

106




106













  • Do not use a callBack, return a promise instead. Try promise chaining to return a promise for the innermost result.

    – Bergi
    Nov 13 '18 at 21:26











  • What exactly is ref.function, and what is the error in it that causes this behaviour?

    – Bergi
    Nov 13 '18 at 21:40











  • @Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.

    – David
    Nov 14 '18 at 17:18













  • What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise .catch(), you will need a try block for that.

    – Bergi
    Nov 14 '18 at 17:34



















  • Do not use a callBack, return a promise instead. Try promise chaining to return a promise for the innermost result.

    – Bergi
    Nov 13 '18 at 21:26











  • What exactly is ref.function, and what is the error in it that causes this behaviour?

    – Bergi
    Nov 13 '18 at 21:40











  • @Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.

    – David
    Nov 14 '18 at 17:18













  • What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise .catch(), you will need a try block for that.

    – Bergi
    Nov 14 '18 at 17:34

















Do not use a callBack, return a promise instead. Try promise chaining to return a promise for the innermost result.

– Bergi
Nov 13 '18 at 21:26





Do not use a callBack, return a promise instead. Try promise chaining to return a promise for the innermost result.

– Bergi
Nov 13 '18 at 21:26













What exactly is ref.function, and what is the error in it that causes this behaviour?

– Bergi
Nov 13 '18 at 21:40





What exactly is ref.function, and what is the error in it that causes this behaviour?

– Bergi
Nov 13 '18 at 21:40













@Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.

– David
Nov 14 '18 at 17:18







@Bergi this function generates a unique ID based on certain criteria. this is a common to all API in the application I've deleted the file ref that has this function, simulating a case which might happen files being deleted/renamed and not updated.

– David
Nov 14 '18 at 17:18















What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise .catch(), you will need a try block for that.

– Bergi
Nov 14 '18 at 17:34





What do you mean by "I've deleted the file that has this function"? If the function you try to call does not exists, that's an exception you cannot catch with promise .catch(), you will need a try block for that.

– Bergi
Nov 14 '18 at 17:34












1 Answer
1






active

oldest

votes


















0














Since ref.function(value) is followed by a then with return k, the catch block probably only catches the errors if ref.function rejects the promise and the errors in the block below (after ref.function)



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


Try adding Promise.resolve before the 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);
});





share|improve this answer


























  • Why? Please explain what difference it would make.

    – Bergi
    Nov 13 '18 at 21:25













  • @Bergi Since the ref.function is the first call, I think that the catch will only catch the errors that happens after that call. With the success, error, it should catch the error from your ref.function.

    – William Juan
    Nov 13 '18 at 21:28













  • No change still keeps hanging.

    – David
    Nov 13 '18 at 21:30











  • @WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP

    – Bergi
    Nov 13 '18 at 21:30











  • @Bergi My bad, I updated my answer

    – William Juan
    Nov 13 '18 at 21:35













Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53289608%2fhow-do-i-chain-promises-and-catch-in-node-js%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









0














Since ref.function(value) is followed by a then with return k, the catch block probably only catches the errors if ref.function rejects the promise and the errors in the block below (after ref.function)



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


Try adding Promise.resolve before the 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);
});





share|improve this answer


























  • Why? Please explain what difference it would make.

    – Bergi
    Nov 13 '18 at 21:25













  • @Bergi Since the ref.function is the first call, I think that the catch will only catch the errors that happens after that call. With the success, error, it should catch the error from your ref.function.

    – William Juan
    Nov 13 '18 at 21:28













  • No change still keeps hanging.

    – David
    Nov 13 '18 at 21:30











  • @WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP

    – Bergi
    Nov 13 '18 at 21:30











  • @Bergi My bad, I updated my answer

    – William Juan
    Nov 13 '18 at 21:35


















0














Since ref.function(value) is followed by a then with return k, the catch block probably only catches the errors if ref.function rejects the promise and the errors in the block below (after ref.function)



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


Try adding Promise.resolve before the 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);
});





share|improve this answer


























  • Why? Please explain what difference it would make.

    – Bergi
    Nov 13 '18 at 21:25













  • @Bergi Since the ref.function is the first call, I think that the catch will only catch the errors that happens after that call. With the success, error, it should catch the error from your ref.function.

    – William Juan
    Nov 13 '18 at 21:28













  • No change still keeps hanging.

    – David
    Nov 13 '18 at 21:30











  • @WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP

    – Bergi
    Nov 13 '18 at 21:30











  • @Bergi My bad, I updated my answer

    – William Juan
    Nov 13 '18 at 21:35
















0












0








0







Since ref.function(value) is followed by a then with return k, the catch block probably only catches the errors if ref.function rejects the promise and the errors in the block below (after ref.function)



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


Try adding Promise.resolve before the 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);
});





share|improve this answer















Since ref.function(value) is followed by a then with return k, the catch block probably only catches the errors if ref.function rejects the promise and the errors in the block below (after ref.function)



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


Try adding Promise.resolve before the 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);
});






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 13 '18 at 22:08

























answered Nov 13 '18 at 21:21









William JuanWilliam Juan

1294




1294













  • Why? Please explain what difference it would make.

    – Bergi
    Nov 13 '18 at 21:25













  • @Bergi Since the ref.function is the first call, I think that the catch will only catch the errors that happens after that call. With the success, error, it should catch the error from your ref.function.

    – William Juan
    Nov 13 '18 at 21:28













  • No change still keeps hanging.

    – David
    Nov 13 '18 at 21:30











  • @WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP

    – Bergi
    Nov 13 '18 at 21:30











  • @Bergi My bad, I updated my answer

    – William Juan
    Nov 13 '18 at 21:35





















  • Why? Please explain what difference it would make.

    – Bergi
    Nov 13 '18 at 21:25













  • @Bergi Since the ref.function is the first call, I think that the catch will only catch the errors that happens after that call. With the success, error, it should catch the error from your ref.function.

    – William Juan
    Nov 13 '18 at 21:28













  • No change still keeps hanging.

    – David
    Nov 13 '18 at 21:30











  • @WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP

    – Bergi
    Nov 13 '18 at 21:30











  • @Bergi My bad, I updated my answer

    – William Juan
    Nov 13 '18 at 21:35



















Why? Please explain what difference it would make.

– Bergi
Nov 13 '18 at 21:25







Why? Please explain what difference it would make.

– Bergi
Nov 13 '18 at 21:25















@Bergi Since the ref.function is the first call, I think that the catch will only catch the errors that happens after that call. With the success, error, it should catch the error from your ref.function.

– William Juan
Nov 13 '18 at 21:28







@Bergi Since the ref.function is the first call, I think that the catch will only catch the errors that happens after that call. With the success, error, it should catch the error from your ref.function.

– William Juan
Nov 13 '18 at 21:28















No change still keeps hanging.

– David
Nov 13 '18 at 21:30





No change still keeps hanging.

– David
Nov 13 '18 at 21:30













@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP

– Bergi
Nov 13 '18 at 21:30





@WilliamJuan Yeah, I know the difference, but please put that explanation in your answer and why you think it caused the problems for the OP

– Bergi
Nov 13 '18 at 21:30













@Bergi My bad, I updated my answer

– William Juan
Nov 13 '18 at 21:35







@Bergi My bad, I updated my answer

– William Juan
Nov 13 '18 at 21:35




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53289608%2fhow-do-i-chain-promises-and-catch-in-node-js%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Xamarin.iOS Cant Deploy on Iphone

Glorious Revolution

Dulmage-Mendelsohn matrix decomposition in Python