Solo Creative Co. Solo Creative Co. - 10 days ago 6
Node.js Question

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? :)

Answer

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);
      });
    });
  });
}
Comments