console.log(1);
const promise = new Promise((resolve, reject) => {
reject();
console.log(2);
});
promise
.then(() => {
console.log(3);
return new Promise((resolve) => {
reject();
});
})
.catch(() => {
console.log(4);
})
.then(() => {
console.log(5);
return new Promise((reject, resolve) => {
reject();
});
})
.catch(() => {
console.log(6);
throw new Error("报错了~");
})
.then(() => {
console.log(7);
throw new Error("报错了~");
})
.then(() => console.log(8))
.then(() => console.log(9))
.catch(() => console.log(10));
console.log(11);
// 执行过程得分析:
/* 首先执行同步代码
1. console.log(1)
2.执行promise中得回调函数
reject();不会立马执行then只是改变了返回值得状态
console.log(2);
3.执行同步代码promise.then(),仅仅执行这个外壳,将内部得回调函数给暴露出来,内部得回调函数是异步的,
所以还不能执行,后面的一堆.的东西,都是在前面的返回值的基础上才会执行的,当前面的部分,没有返回值,后面的是不会执行的,里面的回调函数都是异步的,只有当前面一个promise的实例状态发生改变之后,才会执行内部的回调函数,(外壳都是同步,准备好异步函数)
4.console.log(11)
5.没有同步代码了,开始执行then或者cathch中的回调函数
6.当前是failed的所以第一个then穿透,它没有处理失败的回调函数
7.执行catch中的代码console.log(4);,返回成功
8. 执行console.log(5);,注意回调函数和名字无关,只和书写顺序有关,返回成功
9.穿透catch 执行then,console.log(7);返回失败
10.执行() => console.log(10),*/
// 注意:巧计:只记住报错的情况,1.内部报错,2.返回失败的promise才会返回失败,其他都是成功