Promise代码理解
1.事件循环与 Promise 执行顺序
案例 1:基础 Promise 同步异步区分
console.log(1);
new Promise(resolve => {console.log(2);resolve();console.log(3);
}).then(() => console.log(4));
console.log(5);
输出顺序:1,2,3,5,4
同步代码优先执行:
- 先执行
console.log(1)
→ 输出1
- 遇到
new Promise
,执行构造函数里的同步代码:console.log(2)
→ 输出2
;resolve()
标记 Promise 为已完成,但不影响当前同步流程;接着console.log(3)
→ 输出3
- 继续执行同步代码
console.log(5)
→ 输出5
微任务队列执行:
- 同步代码执行完后,检查微任务队列(Promise 的
then
回调属于微任务),执行then
里的console.log(4)
→ 输出4
先同步再异步,微任务高于宏任务!
案例 2:微任务(Promise) vs 宏任务(setTimeout)
console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
输出顺序:1, 4, 3, 2
同步代码阶段:
console.log(1)
→ 输出1
- 遇到
setTimeout
(宏任务),丢进宏任务队列,暂不执行 - 遇到
Promise.resolve().then
(微任务),丢进微任务队列 console.log(4)
→ 输出4
微任务执行阶段:
- 同步代码跑完,先清空微任务队列 → 执行
then
回调console.log(3)
→ 输出3
宏任务执行阶段:
- 微任务清空后,执行宏任务队列里的
setTimeout
→ 输出2
先同步再异步,微任务高于宏任务!
2.then/catch 的错误捕获逻辑
案例:Promise 链式调用的错误传递
Promise.reject("error").then(() => console.log("success")).catch(err => console.log(err));
执行流程拆解:
Promise.reject("error")
直接生成一个已拒绝的 Promise- 链式调用的
then
回调:因为 Promise 状态是 “拒绝”,then
里的成功回调(() => console.log("success")
)会被跳过 - 后续的
catch
会捕获到前面传递的错误("error"
),执行console.log(err)
→ 输出error
catch兜底,then分流!(catch
主打 “兜底捕获未处理错误”,then
负责 “成功 / 失败的流程分流)