Question

I have created my first deferred object in Node.js using deferred module and it works great when I pass result to next function and trigger resolve and reject.How to chain execution of array of functions when every function returns deferred.promise ? I have like input parameters array of functions and input parameter for first function and every next function get parameter from previous.

It works like f1(100).then(f2).then(f3), but how when I have n number of functions.

Was it helpful?

Solution 2

You need to build a promise chain in a loop:

var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
    promise = promise.then(funcs[i]);

OTHER TIPS

Same idea, but you may find it slightly classier or more compact:

funcs.reduce((prev, cur) => prev.then(cur), starting_promise);

If you have no specific starting_promise you want to use, just use Promise.resolve().

ES7 way in 2017. http://plnkr.co/edit/UP0rhD?p=preview

  async function runPromisesInSequence(promises) {
    for (let promise of promises) {
      console.log(await promise());
    }
  }

This will execute the given functions sequentially(one by one), not in parallel. The parameter promises is a collection of functions(NOT Promises), which return Promise.

Building on @torazaburo, we can also add an 'unhappy path'

funcs.reduce(function(prev, cur) {
  return prev.then(cur).catch(cur().reject);
}, starting_promise); 

ES6, allowing for additional arguments:

function chain(callbacks, initial, ...extraArgs) {
 return callbacks.reduce((prev, next) => {
   return prev.then((value) => next(value, ...extraArgs));
 }, Promise.resolve(initial));
}

For possible empty funcs array:

var promise =  $.promise(function(done) { done(); });
funcs.forEach(function(func) {
  promise = promise.then(func);         
});

If you're using ES7 and need something thenable and similar to Promise.all(), this seems to work.

Promise.resolve(
    (async () => {
        let results = []
        for (let promise of promises) {
            results.push(await promise)
        }
        return results
    })()
)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top