使用promise更正嵌套异步函数的错误处理



让我们以异步函数asyncFunction为例,它采用布尔参数res。如果res为真,则promise将用字符串"0"解析;成功";。如果res为假,则promise将以包含字符串"0"的错误对象拒绝;成功";。

const asyncFunction = (res) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (res) return resolve("Success");
return reject(new Error("Error"));
}, 1000);
});
};

当使用try-catch块时,我从函数innerFunction调用asyncFunction。到目前为止还不错。

const innerFunction = async () => {
try {
return await asyncFunction(false); //Will reject
} catch (error) {
console.log("caught error inside innerFunction");
return error;
}
};

outerFunction中,我正在执行

const outerFunction = async () => {
try {
const result = await innerFunction();
console.log(result);
} catch (error) {
console.log("caught error inside outerFunction");
console.log(error);
}
};

最后,我正在运行外部函数。

outerFunction();

我本以为两个catch块都能捕捉到错误,但我错了。我想你不可能两次抓到同一个异常吗?我不确定,但我的猜测是,在幕后,Error对象被标记为"错误";"已处理";错误,因此在CCD_ 8中不会被识别为一个错误。(我很想了解一下!(

我的解决方案是在innerFunction中抛出一个新错误:

const innerFunction = async () => {
try {
return await asyncFunction(false); //Will reject
} catch (error) {
console.log("caught error inside innerFunction");
throw new Error(error);
}
};

我为篇幅太长而道歉,但最后,我的问题是:这是一个"正确的";处理必须处理outerFunction中错误的情况的方法?有没有";"更好";怎么做?

谢谢!

不,您不能两次捕获相同的错误。中继错误的方法将是错误的。相反,我要做的只是转发输出并在外部函数中处理它们。

const innerFunction = async () => asyncFunction(false); // <-- Just return the outputs
const outerFunction = async () => {
try {
const result = await innerFunction(); // <-- Error is forwarded and thus handled
} catch (error) {
console.log("Caught error inside outerFunction");
}
};

最新更新