(请原谅我的英文)
我现在正在学习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文件名的相同格式的错误消息 为此,首先我应该知道承诺链的哪一部分导致错误。我怎么知道?
答案 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);
我的解决方案有一个先决条件。先决条件是......
即使有些错误,也没有简单的方法来破坏承诺链 发生在链的前几步。
这个先决条件是对的吗?