Javascript Promises:我可以知道promise链的哪一部分导致错误吗?

时间:2018-05-06 19:44:04

标签: javascript node.js es6-promise

(请原谅我的英文)

我现在正在学习javascript承诺。 下面的示例代码是node.js的简单javascript代码(我的node.js版本是v10.0.0 ),它使用promise chain异步读取和解析JSON文件。

const fs = require("fs");

function readFileAsync(filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, 'utf8', (error, result) => {
            if (error)
                reject(error);
            else
                resolve(result);
        });
    });
}

readFileAsync('test.json')
    .then(res => JSON.parse(res))
    .then(res => { console.log('JSON=', res); })
    .catch(err => { console.log(err.message); });

我发现此示例代码生成不同格式的错误消息。 例如,如果找不到' test.json',则错误消息为...

ENOENT: no such file or directory, open '/home/node/test.json'

如果无法解析' test.json',则错误消息为...

Unexpected token / in JSON at position 31

我想修改示例代码以生成始终包含JSON文件名的相同格式的错误消息 为此,首先我应该知道承诺链的哪一部分导致错误。我怎么知道?

2 个答案:

答案 0 :(得分:1)

有两种方法可以达到你想要的效果。

Promise.then有两个参数,请参阅下面的代码和you can get more information here



readFileAsync('test.json')
    .then(res => JSON.parse(res))
    .then(res => { console.log('JSON=', res); }, error => {
      // here can catch error of previous then function
    });




另一种方法是修改函数readFileAsync



function readFileAsync(filename) {
    return new Promise(resolve => {
        fs.readFile(filename, (error, result) => {
            if (error)
                resolve(null); // you can resolve whatever you want
            else
                resolve(result);
        });
    });
}




并且.catch()不会发现readFileAsync的任何错误。

答案 1 :(得分:0)

以下示例代码是我的解决方案。谢谢你,Bergi和Stephen 我之所以选择这个解决方案,是因为我想确切地知道错误发生在链中的哪个位置以及错误是什么。

const fs = require("fs");

function readFileAsync(filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, 'utf8', (error, result) => {
            if (error)
                reject(error);
            else
                resolve(result);
        });
    });
}

function readJsonAsync(filename, fnCallBack) {
    function fnMessage(n, str) {
        console.log(`[${n}:${filename}]`, str);
    }
    readFileAsync(filename)
        .then(
            res => JSON.parse(res),
            err => { fnMessage(-1, err.message); }
        ).then(
            res => {
                // if some errors occured at the previous step, res === undefined
                if (res !== undefined)
                    fnCallBack(filename, res);
            },
            err => { fnMessage(-2, err.message); }
        );
}

function printJSON(filename, json) {
    console.log(`JSON[${filename}]:`, json);
}

readJsonAsync('test.json', printJSON);

我的解决方案有一个先决条件。先决条件是......

  

即使有些错误,也没有简单的方法来破坏承诺链   发生在链的前几步。

这个先决条件是对的吗?