Search code examples
javascriptnode.jsasynchronouspromisebluebird

How to return promise.map (bluebird) inside a promise chain?


I'm using a chain to control flow and can't get promise.map in step2() to wait until all of it's generated promises are resolved.

Here's a visual of the flow I'm trying to achieve.

step1() step2() step2() step2() step2() step3()

In step2() I'm using Bluebird's promise.map.

Here's the chain:

step1()
  .then(function() { return step2() }) 
  .then(function() { return step3() })
  .catch(function() { // handle errors })

Here's my functions for each step:

let step1 = function() {
  return new Promise(function(resolve, reject) {      
    // do stuff
    resolve()
  })
}

let step2 = function() {
  return new Promise(function(resolve, reject) {
    things = []      
    return Promise.map(things, function(thing) {
      // load file async with callback
    })
    resolve()
  })
}

let step3 = function() {
  return new Promise(function(resolve, reject) {      
    // do stuff
    resolve()
  })
}

I've tested the chain with many more steps each with a timeout and it worked as expected with the exception of the promise.map in step2(). What am I doing wrong? :)


Solution

  • The problem is from step 2. Promise.map already return promise, so you can just return it to callee. Then you warp the async function with callback with new Promise.

    let step2 = function() {
      things = []      
      return Promise.map(things, function(thing) {
        // load file async with callback
        return new Promise(function(resolve, reject) {
          fileAsyncFunc(thing, function callback(err, data) {
            if(err) {
              reject(err);
              return;
            }
            resolve(data);
          });
        });
      });
    }