Jake Wilson Jake Wilson - 1 year ago 218
Javascript Question

Promise.all().then() resolve?

Using Node 4.x. When you have a

Promise.all(promises).then()
what is the proper way to resolve the data and pass it to the next
.then()
?

I want to do something like this:

Promise.all(promises).then(function(data){
// Do something with the data here
}).then(function(data){
// Do more stuff here
});


But I'm not sure how to get the data to the 2nd
.then()
. I can't use
resolve(...)
in the first
.then()
. I figured out I can do this:

return Promise.all(promises).then(function(data){
// Do something with the data here
return data;
}).then(function(data){
// Do more stuff here
});


But that doesn't seem like the proper way to do it... What is the right approach to this?

Answer Source

But that doesn't seem like the proper way to do it..

That is indeed the proper way to do it. This is a key aspect of promises, they're a pipeline, and the data can be massaged by the various handlers in the pipeline.

Example:

const promises = [
  new Promise(resolve => setTimeout(resolve, 0, 1)),
  new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
  .then(data => {
    console.log("First handler", data);
    return data.map(entry => entry * 10);
  })
  .then(data => {
    console.log("Second handler", data);
  });

(catch handler omitted for brevity. In production code, always either propagate the promise, or handle rejection.)

The output we see from that is:

First handler [1,2]
Second handler [10,20]

...because the first handler gets the resolution of the two promises (1 and 2) as an array, and then creates a new array with each of those multiplied by 10 and returns it. The second handler gets what the first handler returned.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download