By CrazySynthax


2016-11-16 22:19:11 8 Comments

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.

2 comments

@nem035 2016-11-16 22:22:30

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

  });

@CrazySynthax 2016-11-16 22:25:46

thanks. And what about my second question? Now, result includes all the data from both files. How can get each file's data to a separate array?

@nem035 2016-11-16 22:27:12

@CrazySynthax No problem, check out my edit

@rsp 2016-11-16 22:25:58

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:

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.

@CrazySynthax 2016-11-16 22:29:13

thanks. Isn't there any way to do it without bluebird ?

@rsp 2016-11-16 22:30:55

@CrazySynthax No. A standard Promise has only then which gets an array for Promise.all.

@CrazySynthax 2016-11-16 22:34:02

and if I use 'spread', how is error handling being committed? I didn't see a catch clause in the link.

@rsp 2016-11-16 23:46:34

@CrazySynthax You use .spread(...).catch(...) just like you would .then(...).catch(...).

@rsp 2016-11-16 23:47:35

@CrazySynthax See the Bluebird cheatsheet

Related Questions

Sponsored Content

88 Answered Questions

[SOLVED] How to validate an email address in JavaScript

54 Answered Questions

41 Answered Questions

[SOLVED] How do I remove a property from a JavaScript object?

88 Answered Questions

[SOLVED] How do I remove a particular element from an array in JavaScript?

  • 2011-04-23 22:17:18
  • Walker
  • 6151423 View
  • 7678 Score
  • 88 Answer
  • Tags:   javascript arrays

38 Answered Questions

[SOLVED] How do you get a timestamp in JavaScript?

59 Answered Questions

[SOLVED] How to replace all occurrences of a string?

58 Answered Questions

[SOLVED] How do I include a JavaScript file in another JavaScript file?

86 Answered Questions

[SOLVED] How do JavaScript closures work?

3 Answered Questions

73 Answered Questions

[SOLVED] How can I get query string values in JavaScript?

Sponsored Content