为何添加.catch()后仍出现Uncaught (in promise) Error?
为何添加.catch()后仍出现Uncaught (in promise) Error?
嗨,我来帮你理清这个问题~
你遇到的这个问题,根源在于代码里的promise.then(()=>console.log("then"))这一行,咱们一步步拆解:
- 首先,
errorFunc()返回的是一个会reject的Promise,也就是你定义的promise变量。 - 当你调用
promise.then(...)时,这个then方法会返回一个全新的Promise。因为原始promise是rejected状态,then里的回调根本不会执行,反而会让这个新Promise继承原始Promise的错误,变成rejected状态。 - 关键来了:你完全没有处理这个
then返回的新Promise的错误,所以它就变成了“漏网之鱼”,导致控制台出现Uncaught (in promise) Error。
而你看到的catch和promise all catch日志,是另外两个独立的错误处理在工作:
promise.catch(...)捕获了原始Promise的错误,打印出"catch"Promise.all(promises).catch(...)因为数组里的原始Promise是rejected的,所以捕获了Promise.all的错误,打印出"promise all catch"
但这两个处理都管不到promise.then(...)生成的那个新Promise的错误,所以才会出现未捕获的提示。
修复方案
有两种简单的方式可以解决这个问题:
方式一:链式调用then和catch
把then和catch串起来,这样then返回的Promise的错误会被后面的catch统一处理:
const promise = errorFunc(); // 链式调用,then返回的Promise的错误会被后续catch捕获 promise.then(()=>console.log("then")).catch(()=> console.log("catch")) promises.push(promise)
方式二:移除无用的then调用
因为原始Promise是rejected的,then里的回调根本不会执行,所以如果不需要这个回调,直接删掉这一行就好了:
const promise = errorFunc(); promise.catch(()=> console.log("catch")) promises.push(promise)
这样修改后,就不会再出现未捕获的Promise错误啦~
备注:内容来源于stack exchange,提问作者Illia
相关产品推荐
相关产品推荐

