Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查以下承诺代码_Javascript_Node.js_Asynchronous_Promise_Try Catch - Fatal编程技术网

Javascript 检查以下承诺代码

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

考虑下面给出的代码。这里我阅读了四个文件,其中三个是json,一个是html。函数readJson逐个读取文件并返回Resolve或rejected。所以我的问题是,如果读取前三个文件时除了最后一个
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的第一个被拒绝承诺的拒绝原因,这正是我想要的。尽管它应该是
承诺的一部分。所有的
本身。