被catch()处理的Promise返回值是什么?无返回时后续then为何仍执行
JS Promise 链式调用疑问解答
运行逻辑说明
- 所有 Promise 实例的
.then()、.catch()方法执行后,都会返回一个全新的 Promise 实例,不会复用原 Promise 对象 - 当上游 Promise 触发 rejected 状态时,会被最近的下游
.catch()捕获。只要该.catch()内部没有主动抛出新错误,也没有返回Promise.reject()类型的结果,.catch()返回的新 Promise 就会默认变为 fulfilled(已完成)状态,后续绑定的.then()回调就会正常触发。
你观察到的现象原因
你代码中 .catch() 内部没有显式写 return 语句,JS 里无 return 语句的函数执行结束后默认返回 undefined,因此:
initialCheck()最终返回的是.catch()产出的 fulfilled 状态 Promise- 后续
.then(r => {actualStuff()})的入参r接收到的就是undefined - 所以
actualStuff()会正常执行,控制台打印hello完全符合 Promise 规范。
拓展实现(异常时不执行后续逻辑)
如果你希望端点访问失败时跳过 actualStuff() 的执行,只需要在 .catch() 中抛出错误或者返回 rejected 状态的 Promise 即可,示例如下:
const initialCheck = () => { return fetch('https://thissitedoesnotexistihopeatleast') .then(r => { // 端点可用时的逻辑 return r }) .catch(err => { // 端点不可用时的逻辑 throw new Error('端点访问失败') // 也可以写 return Promise.reject(err) }) }
内容的提问来源于stack exchange,提问作者WoJ
相关产品推荐
相关产品推荐

