// 首先了解catch是什么? 是语法糖!!!
new Promise(() => {
}).catch(() => {
})
// 等同于
new Promise(() => {
}).then(null, () => {
})
我们将
then
的第一个参数叫做success
回调,第二个参数叫做err
回调
一、catch在then之后
1、then
写了err
回调,则错误由err
回调解决
2、then
没写err
回调,则错误由catch
解决
3、如果err
回调也抛出错误,则错误由catch
解决
4、如果catch
之前有多个then
,只要有一个then
抛出错误,就会直接走到catch
5、同理,只要catch
之前有一个err
回调,则错误由err
回调处理,并且中间的then
不会被执行,但是err
后面的then
的success
会被执行
二、catch在then之前
1、错误由catch
解决,但是then
的success
也会执行
2、可以在then
之后继续写catch
,处理后续then
抛出的错误
三、题外话:如果then的success也返回Promise呢?
1、那么这个then
的state
将由返回的Promise
的then
决定
2、并且会将返回的Promise
的then
放入微任务,既Promise.then(()=>{})
整体放入微任务,当微任务执行到Promise.then(()=>{})
时,这里then
的success
会先放入微任务
3、需要强调的是,只有Promise
的state
变为fulfilled
或rejected
时then
才会执行
详细解析请看下方代码!!!
Promise.resolve()
.then(()=>{
console.log(1);
return Promise.resolve(5) // then的success也返回Promise
})
.then((res => {
console.log(res);
}))
Promise.resolve()
.then(() => {
console.log(2);
})
.then(() => {
console.log(3);
})
.then(() => {
console.log(4);
})
/**
* 执行过程是
* 1、将 ()=>{
console.log(1);
return Promise.resolve(5)
} 放入微任务队列
2、将 () => {
console.log(2);
} 放入微任务队列
3、执行 console.log(1);,将 return Promise.resolve(5) 变为 Promise.then(()=>{ return 5 }) 并放入微任务队列
4、执行 console.log(2);
5、将 () => {
console.log(3);
} 放入微任务队列
6、执行 Promise.then(()=>{ return 5 }),将 ()=>{ return 5 } 放入微任务队列
7、执行 console.log(3);
8、将 () => {
console.log(4);
} 放入微任务队列
9、执行 ()=>{ return 5 }
10、将 (res => {
console.log(res);
}) 放入微任务队列
11、执行 console.log(res);
12、输出结果为1,2,3,4,5
*/