关于promise.catch的一点疑惑

一个promise对象,不管之前是resolve还是reject, 只要后面被catch了, 之后的状态就变成resolved是吗? 不是说promise只要状态确定了就不会改变了莫?

    let p1 = new Promise((resolve, reject) => {
        reject('123');
    }) 
    p1最后的状态是rejected,
    
    let p2 = new Promise((resolve, reject) => {
        reject('123');
    }).catch(e => e);
    p2最后的状态是resolved
    

为什么被catch了之后,状态就变了呢,

补充: 今天看到了一个关于promise.all的问题,就翻了下文档,看到文档上的一个例子

    const  p1=  new  Promise((resolve ,  reject)  => {
        resolve('hello');
    }).then(result  =>  result);

    const  p2=  new  Promise((resolve ,  reject)  => {
        reject('world');
    }).then(result  =>  result);

    Promise.all([p1, p2]).then(res =>  console.log(res)).catch(e => console.log(e));
    
这个是正常的, 毕竟p2最终状态为rejected,而promise.all里面的子元素只要有一个状态为rejected, 那么就会成为rejected, 执行catch的操作。
    
    但是如果在p2的后面加上catch
     const  p2=  new  Promise((resolve ,  reject)  => {
        reject('world');
    }).then(result  =>  result).catch(e => e);
    
    那么上面的promise.all就会走then, 而不执行catch。 文档上面写的是 p2有自己的catch方法,该实例执行完catch就会变成resolved,两个子元素都为resolved,所以执行then。
为什么加了catch 状态就变了呢
    
阅读 2.6k
1 个回答

catch 返回的是一个 新的 Promise ,已经不是原来那个了。

如果 catch 的回调正常结果,也没有 return 一个Promise ,那么返回的新的 Promise 的状态是 resolved 。

如果 catch 的回调抛了异常,那么返回的新的 Promise 的状态是 rejected 。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏