次のnode.jsファイルを作成しました。
_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);
});
})
}
_
ご覧のとおり、csvファイルの読み取りの両方の操作を待機するために_Promise.all
_を使用しています。理由はわかりませんが、コードを実行すると'console.log(result)'
行がコミットされません。
2つ目の質問は、Promise.all.then()
のコールバック関数が2つの異なる変数を受け入れるようにしたいのですが、それぞれの変数は関連するpromiseの結果です。
最初の質問
Promise.all
は約束の配列を取ります
変化する:
Promise.all(read_csv_file("devices.csv"), read_csv_file("bugs.csv"))
たす []
引数の周り)
Promise.all([read_csv_file("devices.csv"), read_csv_file("bugs.csv")])
// ---------^-------------------------------------------------------^
2番目の質問
Promise.all
は、渡された各promiseの結果の配列で解決します。
つまり、次のような変数に結果を抽出できます。
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
});
ES6 + destructuring を使用して、コードをさらに簡略化できます。
Promise.all([read_csv_file("devices.csv"), read_csv_file("bugs.csv")])
.then(function([first, second]) {
});
then
コールバックが2つの異なる引数を受け入れるようにする場合は、 Bluebird とそのspread
メソッドを使用できます。見る:
.then(function (array) { ... })
の代わりに、then
ハンドラー内で_array[0]
_と_array[1]
_にアクセスする必要がある場合、spread(function (value1, value2) { ... })
を使用して両方を使用できます必要に応じて名前が付けられた変数。
これはBluebirdの機能であり、単純なPromise
では不可能です。
BluebirdはPromiseと同じように使用します。例:
_var P = require('bluebird');
// and in your code:
return new P(function (resolve, reject) { ...
// instead of:
return new Promise(function (resolve, reject) { ...
_
もちろん、P
という名前にする必要はありませんが、好きな名前を付けることができます。
その他の例については、 Bluebird Cheatsheets を参照してください。