本文不说源码,知道规则后,看源码会容易很多。
Promise 的术语
大概了解
promise是一个有then方法的对象或者是函数,行为遵循本规范thenable是一个有then方法的对象或者是函数value是promise状态成功时的值,也就是resolve的参数, 表示结果的数据reason是promise状态失败时的值, 也就是reject的参数, 表示拒绝的原因exception是一个使用throw抛出的异常值
为什么会有微任务?
调用栈并发量大的时候,微任务可以解决异步时机不可控的问题。
看上图理解下面的话
1.任务队列里存放很多宏任务,都排队等着执行,有一个宏任务正在执行,I/O函数(输出功能)或者发送了网络请求,他们都给数据库执行。
2.数据库执行把函数传回到任务队列中,又得排队,但是我想要他立即执行,这时候给每个宏任务拆分一个调用栈(微任务),每执行完一个宏任务,就清空调用栈。
场景:定时器时间到,要执行前的瞬间,进入了一个宏任务,排在了定时器之前。目标:不受阻塞,直接执行某个函数。
规则
const handler = (resolve, reject) => {
setTimeout(() => {
resolve([3,4,5]);
reject([1,2,3]);
}, 1000);
}
function getSomeThing(url) {
return new Promise(handler)
}
let promise1 = getSomeThing('/api/v1/user/role');
promise1.then((res) => {
console.log(`the result is ${res}`);
}, (error) => {
console.log(`the reason is ${error}`);
});
### 解析:
这里用setTimeOut 模拟异步操作
1. then 函数
- onFulfilled:
(res) => {
console.log('res',res)
}
- onRejected
(err) => {
console.log('err',err)
}
执行顺序
1.状态: pending -> 2.执行resolve(),状态: fulfilled -> 3.执行 onFulfilled
reject执行顺序就不说了,跟resolve一样
[rule--] Promise 的 status 有三种状态: 'pending','fulfilled','rejected'。
- 'pending' --初始状态、可以改变 一个pormise 在 'resolve/reject'前都处于这种状态 可以执行'resolve/reject'方法,让promise变成'fulfilled/rejected'状态
- 'fulfilled'
- 不可变状态
- 在'resolve'后,变成这个状态('fulfilled'),得到一个'value'
- 'rejected'
- 不可变
- 在'reject'后,变成这个状态,得到一个'reason'
then 函数:
- 参数 'onfulfilled' 必须是函数,如果不是就忽略 'onRejected' 必须是函数,如果不是就忽略
- onFulfilled/onRejected 的特效 在primise 变成'fulfilled/rejected' 状态的时候,应该调用'onFulfilled/onRejected' 在promise 变成 'fulfilled/rejected'状态之前,不应该被调用. 只能被调用一次 [--rule]
resolvePromise
有机会再更吧