boop
boop

Reputation: 7788

Conditional then in promises (bluebird)

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

Answers (3)

Xeltor
Xeltor

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

jacksmirk
jacksmirk

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

TbWill4321
TbWill4321

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

Related Questions