使用承诺内容结果映射文件名
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]);
});
我正在使用 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]);
});