Search code examples
javascriptnode.jspromisees6-promise

Make dynamically created promises execute in sequence


How can I dynamically create a series of promises and have them execute in sequence?

pseudocode
 for x=0 to maxValue
   promiseArray.push(createNewPromise(x))

 executeAllPromisesSequentially(promiseArray)

where

executeAllPromisesSequentially is functionally equivalent to

promise1()
.then(promise2)
.then(promise3)
etc
...

Solution

  • There are some patterns displayed on my gist

    Promise Iteration with Reduce

    let tasks = [ /* ... */ ]
    let promise = tasks.reduce((prev, task) => {
      return prev.then(() => {
        return task();
      });
    }, Promise.resolve());
    promise.then(() => {
    //All tasks completed
    });
    

    Sequential Iteration Pattern

    let tasks = [ /* ... */ ]
    let promise = Promise.resolve();
    tasks.forEach(task => {
      promise = promise.then(() => {
        return task();
      });
    });
    promise.then(() => {
    //All tasks completed
    });
    

    Sequential Iteration Example

    function spiderLinks(currentUrl, body, nesting) {
      let promise = Promise.resolve();
      if(nesting === 0) {
        return promise;
      }
      const links = utilities.getPageLinks(currentUrl, body);
      links.forEach(link => {
        promise = promise.then(() => spider(link, nesting - 1));
      });
      return promise;
    }