![](/img/trans.png)
[英]async/await Promise.all() but get response as the promises 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
接受一系列承诺
改变:
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+ 解构来进一步简化代码:
Promise.all([read_csv_file("devices.csv"), read_csv_file("bugs.csv")])
.then(function([first, second]) {
});
如果您希望then
回调接受两个不同的参数,那么您可以使用Bluebird及其spread
方法。 看:
相反的.then(function (array) { ... })
并具有访问array[0]
和array[1]
你的内部then
处理程序,你将能够使用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 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.