Promise.all in JavaScript: How to get resolve value for all promises?
First question
Promise.all
takes an array of promises
Change:
Promise.all(read_csv_file("devices.csv"), read_csv_file("bugs.csv"))
to (add []
around arguments)
Promise.all([read_csv_file("devices.csv"), read_csv_file("bugs.csv")])
// ---------^-------------------------------------------------------^
Second question
The Promise.all
resolves with an array of results for each of the promises you passed into it.
This means you can extract the results into variables like:
Promise.all([read_csv_file("devices.csv"), read_csv_file("bugs.csv")])
.then(function(results) {
var first = results[0]; // contents of the first csv file
var second = results[1]; // contents of the second csv file
});
You can use ES6+ destructuring to further simplify the code:
Promise.all([read_csv_file("devices.csv"), read_csv_file("bugs.csv")])
.then(function([first, second]) {
});
Answer to your second question:
If you want the then
callback to accept two different arguemnts, then you can use Bluebird and its spread
method. See:
- http://bluebirdjs.com/docs/api/spread.html
Instead of .then(function (array) { ... })
and having to access array[0]
and array[1]
inside of your then
handler you will be able to use spread(function (value1, value2) { ... })
and have both variables named as you want.
This is a feature of Bluebird, it's not possible with plain Promise
.
You use Bluebird just like Promise, e.g.:
var P = require('bluebird');
// and in your code:
return new P(function (resolve, reject) { ...
// instead of:
return new Promise(function (resolve, reject) { ...
Of course you don't have to name it P
but whatever you want.
For more examples see the Bluebird Cheatsheets.