Promise.all in JavaScript: 如何获取所有 promise 的 resolve 值?

Promise.all in JavaScript: How to get resolve value for all promises?

我编写了以下 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()的回调函数接受两个不同的变量,而每个变量都是相关承诺的结果。

第一题

Promise.all 接受一组 promises

变化:

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

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

  });

第二个问题的答案:

如果您希望 then 回调接受两个不同的参数,那么您可以使用 Bluebird 及其 spread 方法。参见:

而不是 .then(function (array) { ... }) 并且必须在 then 处理程序中访问 array[0]array[1] 您将能够使用 spread(function (value1, value2) { ... }) 并且同时拥有随心所欲命名的变量。

这是 Bluebird 的一个功能,普通 Promise 做不到。

您像使用 Promise 一样使用 Bluebird,例如:

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