Thursday 21 February 2019

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

Answer


Answer




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



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

});


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...