在异步过程中,又调用了一个异步的方法,见下面代码演示:
Promise1.isValid(key, sc)
.then(
// 这里调用一个第三方实现的异步方法,但是是通过回调函数。
fs.readFileSync(filename, function(err, content){
if(err){
Promise.reject( ErrorFileNotExist); /// <------ 这里希望能将异常传递出来。如何写是正确的呢?
}
}
}
.catch(ErrorFileNotExist, function(err){
console.log(err.message);
// <--- 这里无法获得响应。
});
还请有熟悉的朋友提点一下,这块回调为何不能扑捉到呢?
直接 throw error,或者 return Promise.reject()
@atian25 我试过了的,在异步回调函数中,直接throw, 或者return Promise.reject 是不能被catch捕获。
把 fs.readFileSync 也包装成一个 promise
function readFile(filename) {
return new Promise((resolve, reject) => {
fs.readFileSync(filename, function(err, content){
if(err){
reject( ErrorFileNotExist); /// <------ 这里希望能将异常传递出来。如何写是正确的呢?
}
resolve(content)
}
})
}
Promise1.isValid(key, sc)
.then(() => {
return readFile(filename)
})
.then(content => console.log(content))
.catch(err => {
console.log(err.message);
});
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
:)