Promise

100 阅读2分钟

在了解Promise之前先了解一下进程线程和浏览器原理

1.进程和线程

进程是CPU资源分配的最小单位,线程是CPU调度的最小单位,一个进程里可以有多个线程。

2.浏览器原理

五大主要引擎 截屏2023-05-11 17.02.54.png

3.JS执行原理(EVENT-LOOP)

a.执行栈

  • JS单线程语言,单步执行

b.任务

任务分为宏任务和微任务,同时还有同步和异步的区别

宏任务:script setTimeout setInterval I/O

微任务:new Promise().then()

宏任务的优先级大于微任务,每执行完宏任务会去清空微任务队列然后再执行下一个宏任务。

截屏2023-05-11 22.09.14.png

截屏2023-05-11 22.22.13.png

Promise

promise框架

    1. promise的状态:pending、fullfilled、rejected
    1. new Promise 执行器executor(),执行参数:resolve、reject
    1. promise的默认状态: pending,promise状态流转:只能单向地从pending到fullfilled或者pending到rejected
    1. promise value保存成功状态的枚举:undefined/thenable/promise
    1. 失败状态值:reason

promise接口

  • 6. promise一定有then,then接收来源:两个回调 onFullfilled(value)+onRejected(reason)
    //三个状态。PENDING FULLFILLED REFJECTED
    const PENDING='PENDING' 
    const FULLFILLED='FULLFILLED' 
    const REFJECTED='REFJECTED'
    
    class Promise{
        constructor(executor){
            //默认状态的处理
            this.status = PENDING
            //成功状态的值
            this.value = undefined
            //失败状态的值
            this.reason = undefined
            
            //成功状态的回调
            let resolve = value =>{
                if(this.status === PENDING){
                    this.status=FULLFILLED
                    this.value=value
                }
            }
            //失败状态的回调
            let reject = reason =>{
                if(this.status ===PENDING){
                    this.status=REFJECTED
                    this.reason=reason
                }
            } 
        }
        
        try{
            executor(resolve,reject)
        }catch(error){
            reject(error)
        }
        
        then(onFullfilled,onRejected){
            if(this.status === FULLFILLED){
                onFullfilled(this.value)
            }
            if(this.status === REFJECTED){
                onRejected(this.reason)
            }
        }
        
    }


async await generator

    //1. async await
    function wait500(input){
        return new Promise((resolve, reject) =>{
            console.log('wait500',input);
            setTimeout(() =>{
                resolve(input + 500)
            },500);
        });
    }
    wait500.then(res =>{
         wait500.then(res =>{
              wait500.then(res =>{
                  
              })
         })
    })
    
    async function asyncCall(){
        const result = await wait500(0);
        result = await wait500(0);
        result = await wait500(0);
        result = await wait500(0);
        
        console.log('asyncCall',result);
    }
    asyncCall();
    
    //2. generator 步进代替then
    function* generator(){
        let index=0;
        while(true) yield index++;
    }
    
    let gen=generator();
    gen.next();
    console.log(gen.next().value);
    //结合流水线做自动化处理
    const GEN_LINE = [1,2,3,4,5,6];
    (GEN_LINE || []).forEach(it=>{
        console.log(gen.next(it).value);
    })

异步 异步与同步区别--依次调用

    //三个状态。PENDING FULLFILLED REFJECTED
    const PENDING='PENDING' 
    const FULLFILLED='FULLFILLED' 
    const REFJECTED='REFJECTED'
    
    class Promise{
        constructor(executor){
            //默认状态的处理
            this.status = PENDING
            //成功状态的值
            this.value = undefined
            //失败状态的值
            this.reason = undefined
            
            //存放成功的回调
            this.onResolveCallbacks=[]
            //存放失败的回调
            this.onRejectedCallbacks=[]
            
            //成功状态的回调
            let resolve = value =>{
                if(this.status === PENDING){
                    this.status=FULLFILLED
                    this.value=value
                    
                    //依次调用对应函数的执行this.onResolveCallbacks||[]).forEach(fn=>{
                   fn()})
                }
            }
            //失败状态的回调
            let reject = reason =>{
                if(this.status ===PENDING){
                    this.status=REFJECTED
                    this.reason=reason
                    
                    //依次调用对应函数的执行this.onRejectedCallbacks||[]).forEach(fn=>{
                   fn()})
                }
            } 
        }
        
        try{
            executor(resolve,reject)
        }catch(error){
            reject(error)
        }
        
        then(onFullfilled,onRejected){
            if(this.status === FULLFILLED){
                onFullfilled(this.value)
            }
            if(this.status === REFJECTED){
                onRejected(this.reason)
            }
            
            if(this.status === PENDING){
                this.onResolveCallbacks.push(()=>{
                    onFullfilled(this.value)
                })
                this.onRejectedCallbacks.push(()=>{
                    onRejected(this.reason)
                })
            }
        }
        
    }
//处理同步和异步问题本质上是在处理顺序和空间的关系,所以只需要开辟一个空间单独存放异步的东西