Promise内部实现

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

相关文章

最后的控制台返回空数组.控制台在ids.map函数完成之前运行va...
我正在尝试将rxJava与我已经知道的内容联系起来,特别是来自J...
config.jsconstconfig={base_url_api:"https://douban....
我正在阅读MDN中的javascript,并且遇到了这个谈论承诺并且不...
config.jsconstconfig={base_url_api:"https://douban....
这是我的代码main.cpp:#include<string>#include<...