web-dev-qa-db-ja.com

JavaScriptのPromise.all:すべてのPromiseの解決値を取得する方法は?

次の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の結果です。

7
CrazySynthax

最初の質問

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

  });
23
nem035

2番目の質問への回答:

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 を参照してください。

2
rsp