Promise.all in JavaScript: How to get resolve value for all promises?

CrazySynthax picture CrazySynthax · Nov 16, 2016 · Viewed 19.6k times · Source

I wrote the following node.js file:

var csv = require('csv-parser');
var fs = require('fs')
var Promise = require('bluebird');
var filename = "devices.csv";
var devices;

Promise.all(read_csv_file("devices.csv"), read_csv_file("bugs.csv")).then(function(result) {
    console.log(result);
});


function read_csv_file(filename) {
    return new Promise(function (resolve, reject) {
            var result = []
            fs.createReadStream(filename)
                .pipe(csv())
                .on('data', function (data) {
                    result.push(data)
                }).on('end', function () {
                resolve(result);
            });
    })
}

As you can see, I use Promise.all in order to wait for both operations of reading the csv files. I don't understand why but when I run the code the line 'console.log(result)' is not committed.

My second question is I want that the callback function of Promise.all.then() accepts two different variables, while each one of them is the result of the relevant promise.

Answer

nem035 picture nem035 · Nov 16, 2016

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]) {

  });