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

时间:2016-06-04 02:01:43

标签: javascript bluebird

我使用蓝鸟进行承诺,我试图获取多个文件的内容;我想要的是能够获取文件的内容及其文件名,例如:

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将文件名与文件内容一起获取?

2 个答案:

答案 0 :(得分:3)

为了避免必须创建一个新的promise(所谓的“promise构造函数反模式”):

<div style="visibility: hidden">......</div>

答案 1 :(得分:3)

您的代码无效,因为Promise.all()需要一组promises,但您将这些[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]);
});