resolve(arg){
if(arg.tyeof === promise){
weirenwu(()=>{
if(_fulfilledQueues){ //存于then方法
arg.then(()=>{ //该箭头函数为then方法的参数,即回调函数,调用参数promise的then方法,then方法内部处理机制按照then方法内部源码进行处理
//遍历_fulfilledQueues,并执行_fulfilledQueues中储存的then方法的回调函数,最后将外层promise的status设置1,即resolve状态
})
}else{
//将外层promise的status设置1,即resolve状态
}
},0)
return
}
status = 1//如果参数不是promies,那么会先将将外层promise的状态设置为1,即resolve状态,然后再判断有没有_fulfilledQueues,例子1可以证明
if(_fulfilledQueues){ //如果参数不是promise,那么判断是否存有then方法的回调函数
weirenwu(()=>{
//遍历_fulfilledQueues,并执行_fulfilledQueues中储存的then方法的回调函数
},0)
}
}
then(){
return new Promise( (resolve1)=>{
if(pending){ //父级promise即调用then方法的那个promise的状态是pending的话
//把then方法中的回调函数(记做cb1)放入到_fulfilledQueues
//then方法返回的这个new Promies的状态是由cb1执行的时候改变的,resolve1会作为参数传递给cb1,只有在cb1执行的时候才会调用resolve1,才会将then方法返回的这个new Promies的状态由pending状态改为resolve
//从resolve方法中我们可以分析到只有在执行微任务的时候才会进行 _fulfilledQueues的遍历以及存在于_fulfilledQueues中的cb1的执行
//所以此时在执行宏任务中遇到的then方法,其状态是pending
}else{
weirenwu(()=>{
//执行then方法中传递的回调函数,微任务执行的时候才会改变return的promise的状态
},0)
}
} )
//通过上述分析可以知道,在宏任务中调用then方法时,then方法返回的promise都是pending状态,这保证 了then后继续链式调用then时,后一个then中的回调函数不会立马执行,会先放入到前一个then返回的promise的_fulfilledQueues中,
//只能等前边的then返回的promise执行了resolve之后(resolve的时候会判断是否有_fulfilledQueues,有的话再放入微任务中执行),才会执行后边then中的回调函数。
}
例子1:
let a = new Promise((resolve)=>{
setTimeout(()=>{
new Promise((resolve)=>{
resolve()
}).then(()=>{console.log('a',a)})//resolve
resolve()
console.log('c',a)//resolve
},0)
})
console.log('p',a)//pending
a.then(()=>{console.log(1111,a)})//resolve