promise是异步解决方案,解决回调天堂问题。promise从语法上来说是一个构造函数。从性能来说封装异步操作,并且能够获取其操作后果。

1.根本用法

    const p =new Promise((resolve,reject)=>{        setTimeout(()=>{            //异步操作            resolve(value)        },100)    })

构造函数Promise的参数为一个执行器函数,执行器函数的参数为resolve与reject别离代表:第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用
2.Promise构造函数的实现

Promise对象外部含有三种状态,初始值pending 已胜利 resolved 已失败 rejected外部的状态在执行过程中,状态只能扭转一次并且不可逆。 

初始化 初始时候将status的状态为pending callbacks用来保留胜利的与失败的回调函数

        self.status =PENDING        self.data =undefined        self.callbacks =[] //每个元素构造 {onResolved(){}  onRejected(){}  }
    function Promise(excutor){        const self =this        self.status =PENDING        self.data =undefined        self.callbacks =[] //每个元素构造 {onResolved(){}  onRejected(){}  }        function resolve(value){            // resolve函数的作用将promise状态变为resolved            if(self.status!==PENDING){                //如果不是pending状态间接返回                return            }            self.status =RESOLVED            self.data = value            if(self.callbacks.length>0){               setTimeout(() => {                    self.callbacks.forEach(callbacksObj => {                        callbacksObj.onResolved(value)                                            });                  },0);                }        }        function reject(reason){            if(self.status!==PENDING){                return            }            self.status =REJECTED            self.data = reason            if(self.callbacks.length>0){               setTimeout(() => {                   //遍历回调队列                    self.callbacks.forEach(callbacksObj => {                        callbacksObj.onRejected(reason)                                            });                  });                }        }       //立刻同步执行ex       try{        excutor(resolve,reject)       }catch(err){           reject(err)       }           }

3.promise实例的then办法

then办法的第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数,它们都是可选的。并且返回也是一个Promise对象有三种状况
  • 如果回调函数返回是promise return的promise的后果就是这个promise的后果
  • 如果回调函数返回不是promise return的promise就会胜利 value就是返回值
  • 如果抛出异样 return的promise就会失败 resaon就是error
    Promise.prototype.then=function(onResolved,onRejected){        const self =this        onResolved = typeof onResolved === 'function' ? onResolved :value =>value        onRejected = typeof onRejected === 'function' ? onRejected :reason =>{throw reason}        //返回一个新的promise 对象         return new Promise((resolve,reject)=>{        //调用指定的回调函数解决、依据执行后果 扭转return的promise状态        function handle(callback){            try{                const result =callback(self.data)                if(result instanceof Promise){                    //如果回调函数返回是promise return的promise的后果就是这个promise的后果                    result.then(value =>{                         resolve(value)                    },reason =>{                         reject(reason)                    })                    // result.then(resolve,reject)                }else{                    //如果回调函数返回不是promise return的promise就会胜利 value就是返回值                    resolve(result)                }            }catch(error){             //如果抛出异样 return的promise就会失败 resaon就是error                reject(error)            }         }            if(self.status === PENDING){                self.callbacks.push({                    onResolved(){                        handle(onResolved)                    },                    onRejected(){                        handle(onRejected)                     }                })                }else if(self.status === RESOLVED){                setTimeout(()=>{                    handle(onResolved)                })                }else{                setTimeout(()=>{                    handle(onRejected)                })            }        })             }

4.Promise对象的catch办法

作用来捕捉产生谬误的回调办法
    Promise.prototype.catch=function(onRejected){        return this.then(undefined,onRejected)      }

5 Promise的resolve办法

作用是将对象变为Promise对象。如果resolve办法参数是非Promise对象间接将value传递上来,如果是Promise对象value的后果将作为Promise的后果
    Promise.resolve = function(value){        return new Promise((resolve,reject)=>{            //value是promise            if(value instanceof Promise){                //应用value的后果作为promise的后果                value.then(resolve,reject)            }else{                  //value不是promise                  resolve(value)            }        })    }

6.Promise的reject办法

作用返回一个rejected的Promise对象
    Promise.reject = function(reason){        return new Promise((resolve,reject)=>{            reject(reason)        })    }

7.Promise的all办法

  作用:执行多个Promise 并返回新的Promise实例  all办法接管一个数组参数:
  • 如果Promise对象全副胜利,将返回一个数组保留每个胜利的Promise的返回值。
  • 如果有一个Promise对象失败 新的Promise将变为失败 返回值为执行失败的Promise的返回值
    Promise.all = function(promises){        //用来保留所有胜利value的数组        const values =new Array(promises.length)        //用来保留胜利promise的数量        let count = 0         return new Promise((resolve,reject)=>{            //获取每个promise的后果            promises.forEach((p,index)=>{                Promise.resolve(p).then(value=>{                    count++                    values[index] = value //保留胜利的值                    //如果全副胜利了,将return的promise变为胜利                    if(count === promises.length){                        resolve(values)                    }                },reason =>{                    reject(reason)                })            })        })    }

8.Promise的race办法

 作用:返回一个新的Promise对象,最先执行实现Promise的返回值作为新的Promise对象的后果
    Promise.race = function(promises){        return new Promise((resolve,reject)=>{            //获取每个promise的后果            promises.forEach((p)=>{                Promise.resolve(p).then(value=>{                    resolve(value)                },reason =>{                    reject(reason)                })            })        })    }