检查以下承诺代码

时间:2017-02-28 05:23:38

标签: javascript node.js asynchronous promise try-catch

考虑下面给出的代码。在这里,我正在阅读四个文件,其中三个是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);
})

1 个答案:

答案 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);
        }
    });
})