Nodejs中使用Promise后,对于异步操作中的异常如何正确的捕捉呢?
发布于 8 年前 作者 liuran 4558 次预览 最后一次回复是 8 年前 来自 问答
在异步过程中,又调用了一个异步的方法,见下面代码演示:
Promise1.isValid(key, sc)
.then(
// 这里调用一个第三方实现的异步方法,但是是通过回调函数。
fs.readFileSync(filename, function(err, content){
if(err){
Promise.reject( ErrorFileNotExist); /// <------ 这里希望能将异常传递出来。如何写是正确的呢?
}
}
}
.catch(ErrorFileNotExist, function(err){
console.log(err.message);
// <--- 这里无法获得响应。
});
还请有熟悉的朋友提点一下,这块回调为何不能扑捉到呢?
8 回复
直接 throw error,或者 return Promise.reject()
@atian25 我试过了的,在异步回调函数中,直接throw, 或者return Promise.reject 是不能被catch捕获。
把 fs.readFileSync 也包装成一个 promise
Promise.reject( ErrorFileNotExist); /// <------ 这里希望能将异常传递出来。如何写是正确的呢? 改成: throw new error(ErrorFileNotExist)
@liuran 因为你写错了啊,
then(fs.readFileSync())肯定不行啦, 要then(() => return fs.readFileSync())@nodejh 赞,我刚才也是改成了你这种方法,解决了这个问题。确实,需要把异步调用函数再包成一个Promise对象返回,才能在Promise的调用链里传递异常。
@liuran 1、
.then或者.catch的参数期望是函数,传入非函数则会发生值穿透。你可以想下你那样写最后then得到的是啥类型 2、你读文件的时候,既然用Sync$同步方法,为啥还传callback函数。。为了性能建议改成异步的 3、报错了是不是该早点return:)@soda-wy 我的演示伪码中没有写清楚then里是函数,主要是fs.readFileSync这个是第三者写的,现在和@nodejh的思路一样,把它封装到了Promise中,问题已经解决了
多谢大家的意见。