考虑下面给出的代码。在这里,我正在阅读四个文件,其中三个是json,一个是html。函数 readJson 逐个读取文件并返回promise resoved或reject。所以我的问题是如果前三个文件被读取而没有任何错误,除了最后一个index.html
,那么前三个文件应该被记录,除了最后一个。但这并非如此,程序不会打印任何文件。为什么呢?
var pages = [
"a.json",
"b.json",
"c.json",
"index.html"
];
var fs = require('fs');
function readJson(page){
console.log("this file name is:",page);
return new Promise(function(resolve,reject){
fs.readFile("./"+page,"utf8",function(err,res){
if(err){
reject(err);
}else{
try {
resolve(JSON.parse(res));
} catch (ex) {
reject(ex);
}
}
});
});
}
function readAll(pages){
return Promise.all(pages.map(readJson));
}
readAll(pages).then(function(allPages){
allPages.forEach(function(page){
console.log("++++++++++++++++++++++++++++++++++++++++++");
console.log(page);
});
})
.catch(function(err){
console.log("-----------------------------------------------");
console.log(err);
})
答案 0 :(得分:0)
Promise.all
旨在快速失败 - 即使其中一项承诺拒绝,所有这些都被拒绝。如果你仍然需要响应(分辨率或错误),你可以使用这样的东西 -
function readAll(pages) {
return Promise.all(pages.map(readJson).map(p => p.catch(e => new Error(e))))
.then(results => results);
}
这将返回一组成功的分辨率或Error
个对象,因为永远不会返回catch。然后你可以使用像这样的逻辑来判断是否发生了一些异常 -
readAll(pages).then(function (allPages) {
allPages.forEach(function (page) {
if (page instanceof Error) {
console.log("-----------------------------------------------");
console.log(page);
} else {
console.log("++++++++++++++++++++++++++++++++++++++++++");
console.log(page);
}
});
})