bummzack bummzack - 14 days ago 6
Javascript Question

How do I chain multiple conditional promises?

In my code I have conditional tasks, which all return a promise. I need the tasks to run in sequence.

My current implementation looks something like this:

var chain = [];

if (/* some condition for task A */) {
chain.push(function(doContinue){
taskA().then(doContinue);
});
}

if (/* some condition for task B */) {
chain.push(function(doContinue){
taskB().then(doContinue);
});
}

if (/* some condition for task C */) {
chain.push(function(doContinue){
taskC().then(doContinue);
});
}

var processChain = function () {
if (chain.length) {
chain.shift()(processChain);
} else {
console.log("all tasks done");
}
};

processChain();


This works fine, but initially I was looking for a way to create the chain using only Promises and chaining all functions using
.then
, but I wasn't able to get a working solution.

If there's a cleaner way using only Promises and chains of
then
calls, then I'd love to see an example.

Answer

One possible approach:

var promiseChain = Promise.resolve();
if (shouldAddA) promiseChain = promiseChain.then(taskA);
if (shouldAddB) promiseChain = promiseChain.then(taskB);
if (shouldAddC) promiseChain = promiseChain.then(taskC);
return promiseChain;

Another one:

return Promise.resolve()
  .then(shouldAddA ? taskA : null)
  .then(shouldAddB ? taskB : null)
  .then(shouldAddC ? taskC : null);