长处:1.反对链式调用,能够解决回调天堂问题

export default function Promise(executor) {    this.PromiseState = 'pending'    this.PromiseResult = null    this.callbacks = []    const self = this    function resolve(data) {        if (self.PromiseState !== 'pending') return//不可反复更改状态        self.PromiseState = 'fulfilled' //批改状态        self.PromiseResult = data//后果赋值        //异步函数执行回调函数        setTimeout(()=>{            self.callbacks.forEach(item => {                item.onResolved(data)                })        })            }    function reject(data) {        if (self.PromiseState !== 'pending') return        self.PromiseState = 'rejected'        self.PromiseResult = data        setTimeout(()=>{            self.callbacks.forEach(item => {                item.onRejected(data)                })        })           }    try {        executor(resolve, reject)    } catch (error) {        console.log('err' + error)        reject(error)    }    return executor(resolve, reject)}Promise.prototype.then = function (onResolved, onRejected) {    const self = this    if(typeof onRejected !=='function'){        onRejected = reason =>{            throw reason        }    }    if(typeof onResolved!=='function'){        onResolved = value =>value    }    return new Promise((resolve, reject) => {        function callback(type) {            try {                let result = type(self.PromiseResult)                if (result instanceof Promise) {                    result.then(v => {                        resolve(v)                    }, r => {                        resolve(r)                    })                } else {                    resolve(result)                }            } catch (e) {                reject(e)            }        }        if (this.PromiseState === 'fulfilled') {            callback(onResolved)        } else if (this.PromiseState === 'rejected') {            callback(onRejected)        } else if (this.PromiseState === 'pending') {            //异步调用时,在扭转状态后执行函数            this.callbacks.push({                onResolved: function () {                    setTimeout(()=>{                      callback(onResolved)                    })                                   },                onRejected: function () {                    setTimeout(()=>{                      callback(onRejected)                    })                }            })        }    })}Promise.prototype.catch = function(onRejected){    return this.then(undefined,onRejected)}