Reputation: 7788
What I want to do
getFoo()
.then(doA)
.then(doB)
.if(ifC, doC)
.else(doElse)
I think the code is pretty obvious? Anyway:
I want to do call a promise when a specific condition (also a promise) is given. I could probably do something like
getFoo()
.then(doA)
.then(doB)
.then(function(){
ifC().then(function(res){
if(res) return doC();
else return doElse();
});
But that feels pretty verbose.
I'm using bluebird as promise library. But I guess if there is something like that it'll be the same in any promise library.
Upvotes: 6
Views: 12080
Reputation: 4654
Based on this other question, here's what i came up with for an optional then:
Note: if your condition function really needs to be a promise, look at @TbWill4321's answer
answer for optional then()
getFoo()
.then(doA)
.then(doB)
.then((b) => { ifC(b) ? doC(b) : Promise.resolve(b) }) // to be able to skip doC()
.then(doElse) // doElse will run if all the previous resolves
improved answer from @jacksmirk for conditional then()
getFoo()
.then(doA)
.then(doB)
.then((b) => { ifC(b) ? doC(b) : doElse(b) }); // will execute either doC() or doElse()
EDIT: I suggest you have a look at Bluebird's discussion on having a
promise.if()
HERE
Upvotes: 5
Reputation: 21
I think you are looking for something like this
An example with your code:
getFoo()
.then(doA)
.then(doB)
.then(condition ? doC() : doElse());
The elements in the condition must be defined before starting the chain.
Upvotes: 2
Reputation: 8666
You don't need to have nested .then
calls, since it seems like ifC
returns a Promise
anyways:
getFoo()
.then(doA)
.then(doB)
.then(ifC)
.then(function(res) {
if (res) return doC();
else return doElse();
});
You could also do some legwork up front:
function myIf( condition, ifFn, elseFn ) {
return function() {
if ( condition.apply(null, arguments) )
return ifFn();
else
return elseFn();
}
}
getFoo()
.then(doA)
.then(doB)
.then(ifC)
.then(myIf(function(res) {
return !!res;
}, doC, doElse ));
Upvotes: 4