我如何使用Promise.all()和异步循环?

时间:2017-09-24 22:13:38

标签: javascript node.js promise bluebird

我正试图围绕Promises以及如何在异步循环中使用它们。

我收集了以下代码来读取三个文件的内容(使用forEach),并且当所有promises解析日志时所有文件的输出:

var Promise = require('bluebird');
var fs = require('fs');
var path = require('path');

var files = ['1.json','2.json','3.json'];
var promises = []

files.forEach(function(file){
    fs.readFile(path.join('./',file), 'utf8', function(err,data){
        promises.push(new Promise(function(resolve, reject){
            resolve(data)
        })
                );
    })
});

Promise.all(promises).then(function(values){
    console.log(values)
});

我不知道如何将循环放在.all()

我尝试了这段代码,但这会记录一个空数组。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

您将回调与promises混合,使用Array#map创建一系列承诺并将其传递给Promise.all

var files = ['1.json', '2.json', '3.json'];
var promises = files.map(file => {
  return new Promise((resolve, reject) => {
    fs.readFile(path.join('./',file), 'utf8', (err, data) => {
      if (err) {
        return reject(err);
      }
      resolve(data);
    });
  });
});

Promise.all(promises).then(function(values){
    console.log(values)
});

答案 1 :(得分:0)

使用.map()迭代您的数组,为每个数组启动异步调用,然后为每个调用返回promise。该地图的返回值将是一个新的承诺数组,您可以将其传递给Promise.all()

let Promise = require('bluebird')
let fs = Promise.promisifyAll(require('fs'))

let promises = files.map((file) => {
  // readFile will return promises because of bluebird promisifyAll
  return fs.readFile(...)
})

Promise.all(promises).then((results) => {
  // results will be an array of all the files that were read
  console.log(results);
});