Javascript 检查以下承诺代码
考虑下面给出的代码。这里我阅读了四个文件,其中三个是json,一个是html。函数readJson逐个读取文件并返回Resolve或rejected。所以我的问题是,如果读取前三个文件时除了最后一个Javascript 检查以下承诺代码,javascript,node.js,asynchronous,promise,try-catch,Javascript,Node.js,Asynchronous,Promise,Try Catch,考虑下面给出的代码。这里我阅读了四个文件,其中三个是json,一个是html。函数readJson逐个读取文件并返回Resolve或rejected。所以我的问题是,如果读取前三个文件时除了最后一个index.html之外没有任何错误,那么除了最后一个文件之外,前三个文件应该被记录。但这并不是说程序不会打印任何文件。为什么? var pages = [ "a.json", "b.json", "c.json", "index.htm
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);
})
承诺。所有的
都被设计为快速失败-即当其中一个承诺被拒绝时,所有的承诺都被拒绝。如果您仍然需要响应(解决方案或错误),您可以使用如下内容-
function readAll(pages) {
return Promise.all(pages.map(readJson).map(p => p.catch(e => new Error(e))))
.then(results => results);
}
readAll(pages).then(function (allPages) {
allPages.forEach(function (page) {
if (page instanceof Error) {
console.log("-----------------------------------------------");
console.log(page);
} else {
console.log("++++++++++++++++++++++++++++++++++++++++++");
console.log(page);
}
});
})
这将返回一个成功解析或Error
对象的数组,因为catch永远不会返回。然后,您可以使用如下逻辑确定是否发生了异常-
function readAll(pages) {
return Promise.all(pages.map(readJson).map(p => p.catch(e => new Error(e))))
.then(results => results);
}
readAll(pages).then(function (allPages) {
allPages.forEach(function (page) {
if (page instanceof Error) {
console.log("-----------------------------------------------");
console.log(page);
} else {
console.log("++++++++++++++++++++++++++++++++++++++++++");
console.log(page);
}
});
})
因为这就是Promise.所有的rolls。。。一次拒绝将导致
Promise.all
拒绝-当然,您可以resolve(“”)
而不是readJson
中的拒绝。您可以使用readJson
中的逻辑调用JSON.parse()
或不调用res
来resolve()
。你们的意思是说,如果发生一次拒绝或错误,无论承诺是否兑现,所有承诺都会被拒绝。那么使用承诺的好处是什么呢?总之,我可以通过链接承诺来实现这一点。是的。这就是Promise.all()
的执行方式。您也可以顺序调用函数,而不使用Promise.all()
,或者在.catch()
处处理拒绝,并返回已解决的Promise
如果发生一次拒绝或错误,则所有承诺都会被拒绝
-否。。。promise返回的单个promise.all
要么作为“已实现”值的数组实现,要么作为输入arraythanx@gpx的第一个被拒绝承诺的拒绝原因,这正是我想要的。尽管它应该是承诺的一部分。所有的本身。