I have a problem with jQuery 1.9.1 promises, where I potentially need conditional logic that will return another deferred and I'm not sure how to handle it. This was my best attempt, but as the comments indicate below, when I hit the else branch, I still hit the second .then() function, where I'm hoping I could go back to the user. Any patterns for how to handle such a scenario?
storage.provision(c)
.then(function(rc){
if(rc === 0){
storage.write(c);
}else{
return options.onSuccess(rc); //how i got back to the users callbacks/promise, but this
//takes me to the .then below
}
})
//storage.write returns a promise as well, do I do another .then
// like this?
.then(function(rc){
//I was hoping this would catch, the storage.write() case, and it does, but it also catches
//the retun options.onSuccess(rc) in the else case.
options.onSuccess(rc);
})
.fail(function(e){
//handle error using .reject()
});
This becomes easier by taking the view that options.onSuccess(rc); is executed unconditionally in the second .then() but never in the first.
Thus, the first .then() must pass on rc either :
rc === 0, in response to storage.write(c) completing rc !== 0..then() is really handy for this because it naturally allows either a value of a new Promise to be returned from its done callback.
storage.provision(c).then(function(rc) {
if(rc === 0) {
var dfrd = $.Deferred();
storage.write(c).done(function() {
dfrd.resolve(rc);
}).fail(dfrd.fail);
return dfrd.promise();
} else {
return rc;//pass on rc to the second .then()
}
}).then(function(rc){
options.onSuccess(rc);
}).fail(function(e){
//handle error using .reject()
});
I'm sure other approaches exist but this is the closest I can think of to your original concept.
It would be nice not to have to create a new Deferred when rc === 0 but it's the most realistic approach to passing on rc, avoiding the need to modify storage.write() to behave in this way.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With