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.
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]) {
});
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 .