我使用蓝鸟进行承诺,我试图获取多个文件的内容;我想要的是能够获取文件的内容及其文件名,例如:
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将文件名与文件内容一起获取?
答案 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]);
});