JavaScript中的Promise.all:如何获得所有承诺的解析值?

JavaScript中的Promise.all:如何获得所有承诺的解析值?,javascript,node.js,ecmascript-6,promise,bluebird,Javascript,Node.js,Ecmascript 6,Promise,Bluebird,我编写了以下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) { c

我编写了以下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的结果

第一个问题

承诺。所有的
都包含一系列承诺

更改:

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

  });
回答你的第二个问题: 如果希望
then
回调接受两个不同的参数,则可以使用及其
spread
方法。见:

而不是
.then(function(array){…})
并且必须访问
array[0]
array[1]
内部的
处理程序,然后您将能够使用
spread(function(value1,value2){…}
并根据需要命名这两个变量

这是蓝鸟的一项功能,它不可能与普通的
Promise
配合使用

您使用蓝鸟就像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就没有办法了吗?@CrazySynthax没有。标准的Promise只有
,然后
会得到Promise.all的数组。如果我使用“spread”,错误处理是如何提交的?我在链接中没有看到catch子句。@CrazySynthax您使用的是
.spread(…).catch(…)
,就像使用
一样。然后(…).catch(…)
@CrazySynthax查看
var P = require('bluebird');
// and in your code:
return new P(function (resolve, reject) { ...
// instead of:
return new Promise(function (resolve, reject) { ...