一个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 状态就变了呢
catch 返回的是一个 新的 Promise ,已经不是原来那个了。
如果 catch 的回调正常结果,也没有 return 一个Promise ,那么返回的新的 Promise 的状态是 resolved 。
如果 catch 的回调抛了异常,那么返回的新的 Promise 的状态是 rejected 。