【问题标题】:Promise.all in JavaScript: How to get resolve value for all promises?JavaScript 中的 Promise.all:如何获得所有承诺的解析值?
【发布时间】:2017-03-31 07:34:36
【问题描述】:

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


    【解决方案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 解析一组结果。

    这意味着您可以将结果提取到变量中,例如:

    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 回调接受两个不同的参数,那么您可以使用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

    【讨论】:

    • 谢谢。没有蓝鸟就没有办法吗?
    • @CrazySynthax 没有。标准的 Promise 只有 then,它获取 Promise.all 的数组。
    • 如果我使用'spread',如何提交错误处理?我在链接中没有看到 catch 子句。
    • @CrazySynthax 你使用.spread(...).catch(...) 就像你使用.then(...).catch(...) 一样。
    • @CrazySynthax 见Bluebird cheatsheet
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2016-06-22
    • 2022-08-20
    • 2023-03-24
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多