wake-up-neo.com

Promise.all in JavaScript: Wie erhält man einen Auflösungswert für alle Versprechen?

Ich habe die folgende node.js-Datei geschrieben: 

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);
            });
    })
}

Wie Sie sehen, verwende ich Promise.all, um auf beide Vorgänge des Lesens der CSV-Dateien zu warten. Ich verstehe nicht warum, aber wenn ich den Code laufe, wird die Zeile 'console.log(result)' nicht festgeschrieben. 

Meine zweite Frage ist, dass ich möchte, dass die Rückruffunktion von Promise.all.then() zwei verschiedene Variablen akzeptiert, während jede von ihnen das Ergebnis des jeweiligen Versprechens ist. 

6
CrazySynthax

Erste Frage

Promise.all nimmt eine Reihe von Versprechen

Veränderung:

Promise.all(read_csv_file("devices.csv"), read_csv_file("bugs.csv"))

to (add [] um Argumente hinzufügen)

Promise.all([read_csv_file("devices.csv"), read_csv_file("bugs.csv")])
// ---------^-------------------------------------------------------^

Zweite Frage

Der Promise.all wird mit einer Reihe von Ergebnissen für jedes der Versprechungen aufgelöst, die Sie ihm übergeben haben.

Das bedeutet, dass Sie die Ergebnisse in Variablen extrahieren können:

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
  });

Sie können ES6 + destructuring verwenden, um den Code weiter zu vereinfachen:

Promise.all([read_csv_file("devices.csv"), read_csv_file("bugs.csv")])
  .then(function([first, second]) {

  });
19
nem035

Beantworten Sie Ihre zweite Frage:

Wenn Sie möchten, dass then callback zwei unterschiedliche Argumente akzeptiert, können Sie die Bluebird - Methode und ihre spread-Methode verwenden. Sehen:

Anstatt .then(function (array) { ... }) auf array[0] und array[1] innerhalb Ihres then-Handlers zugreifen zu müssen, können Sie spread(function (value1, value2) { ... }) verwenden und beide Variablen nach Belieben benennen lassen.

Dies ist eine Funktion von Bluebird. Es ist nicht möglich mit einfacher Promise.

Sie verwenden Bluebird wie Promise, z.

var P = require('bluebird');
// and in your code:
return new P(function (resolve, reject) { ...
// instead of:
return new Promise(function (resolve, reject) { ...

Natürlich müssen Sie es nicht P nennen, aber was immer Sie wollen.

Weitere Beispiele finden Sie in den Bluebird Cheatsheets .

1
rsp