使用承诺内容结果映射文件名

Map filename with promise contents result

我正在使用 bluebird 进行 promises,我正在尝试获取多个文件的内容;我想要的是能够获取文件的内容及其文件名,例如:

result = { 'file1.md': content }

我一直在尝试这样的事情:

var files = [
    { filename: 'README.md', url: 'assetFiles/README.md' },
    { filename: 'CHANGELOG.md', url: 'assetFiles/CHANGELOG.md' },
    { filename: 'ISSUES_TEMPLATE.md', url: 'assetFiles/ISSUES_TEMPLATE.md' },
    { filename: 'PULL_REQUEST_TEMPLATE.md', url: 'assetFiles/PULL_REQUEST_TEMPLATE.md' }];

  return Promise.all(files.map(function(file) {
    return [file.filename, fs.readFileAsync(file.url, 'utf-8')];
  }))
  .then(function(results){
    console.log(results);
  };

然而,我从中得到的是一个像这样的数组:

result = [ ['file1.md', Promise ], ... ];

如何使用 bluebird 获取文件名和文件内容?

为了避免必须创建新的承诺(所谓的 "promise constructor anti-pattern"):

var result = Promise.all(files.map(function(file) {
  return fs.readFileAsync(file.url, "utf-8")
    .then(data => [file.filename, data]);
});

result
  .then(function(results){
    console.log(results);
  })
  .catch(function(err) {
    console.log(err);
  });

return result;

您的代码无法正常工作,因为 Promise.all() 需要一组承诺,但您向它传递了一个数组 [data, promise]。因此,它不知道如何等待所有单独的承诺。

由于您使用的是 Bluebird,因此可以直接使用 Promise.map()。它会自动为您组合数组 .map() 迭代和 Promise.all()

return Promise.map(files, function(file) {
  return fs.readFileAsync(file.url, "utf-8").then(data => [file.filename, data]);
});