Nodejs中使用Promise后,对于异步操作中的异常如何正确的捕捉呢?
发布于 6 年前 作者 liuran 3892 次浏览 来自 问答

在异步过程中,又调用了一个异步的方法,见下面代码演示:


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

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 :)

@soda-wy 我的演示伪码中没有写清楚then里是函数,主要是fs.readFileSync这个是第三者写的,现在和@nodejh的思路一样,把它封装到了Promise中,问题已经解决了

多谢大家的意见。

回到顶部