Promise.all在JavaScript:如何获得所有的承诺的决心价值?Promise.all在

2019-05-12 05:50发布

我写了下面的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);
            });
    })
}

正如你所看到的,我用Promise.all以等待读取CSV文件,这两种操作。 我不明白为什么,但是当我运行的代码行'console.log(result)'未提交。

我的第二个问题,我想是的回调函数Promise.all.then()接受两个不同的变量,而他们中的每一个是相关承诺的结果。

Answer 1:

第一个问题

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")])
// ---------^-------------------------------------------------------^

第二个问题

Promise.all解决了结果为每个传递给它的承诺的数组。

这意味着你可以提取结果到像变量:

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 + 解构 ,进一步简化代码:

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

  });


Answer 2:

回答你的第二个问题:

如果你想在then的回调接受两个不同的arguemnts,那么你可以使用蓝鸟及其spread方法。 看到:

  • http://bluebirdjs.com/docs/api/spread.html

相反的.then(function (array) { ... })并具有访问array[0]array[1]里面你then处理程序,你将能够使用spread(function (value1, value2) { ... })并有一个名为两个变量,只要你想。

这是蓝鸟的一个特点,它不可能与普通的Promise

您可以使用蓝鸟就像承诺,例如:

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

当然,你不必将其命名为P ,但任何你想要的。

更多的例子看到蓝鸟备忘 。



文章来源: Promise.all in JavaScript: How to get resolve value for all promises?