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

问题描述 投票:7回答:2

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

javascript node.js ecmascript-6 promise bluebird
2个回答
23
投票

第一个问题

Promise.all承担了一系列承诺

更改:

Promise.all(read_csv_file("devices.csv"), read_csv_file("bugs.csv"))

to(在参数周围添加[]

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

  });

2
投票

回答你的第二个问题:

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

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

这是蓝鸟的一个特点,用普通的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

© www.soinside.com 2019 - 2024. All rights reserved.