promise源码

44 阅读1分钟
function Promise(executor) {
    this.PromiseState = 'pending';
    this.PromiseResult = null;
    this.callbacks = [];
    const self = this;
    function resolve(data) {
        if (self.PromiseState !== 'pending') return
        //修改对象状态(promiseState)
        self.PromiseState = 'fulfilled';
        //修改结果值(promiseResult)
        self.PromiseResult = data;
        self.callbacks.forEach(item => {
            item.onResolved(data)
        })

    }
    function reject(data) {
        if (self.PromiseState !== 'pending') return
        //修改对象状态(promiseState)
        self.PromiseState = 'reject';
        //修改结果值(promiseResult)
        self.PromiseResult = data;
        self.callbacks.forEach(item => {
            item.onRejected(data)
        })
    }
    try {
        executor(resolve, reject)
    } catch (error) {
        reject(error)
    }

}
Promise.prototype.then = function (onResolved, onRejected) {
    const self = this;
    return new Promise((resolve, reject) => {
        if(typeof onRejected !== 'function'){
            onRejected = reason =>{
                throw reason
            }
        }
        if(typeof onResolved !== 'function'){
            onResolved = value => value
        }
        function callback(type){
            try {
                let result = type(self.PromiseResult)
                if (result instanceof Promise) {
                    result.then(v => {
                        resolve(v)
                    }, r => {
                        reject(r)
                    })
                } else {
                    resolve(result)
                }
            } catch (error) {
                reject(error)
            }
        }
        if (this.PromiseState === 'fulfilled') {
            callback(onResolved)

        }
        if (this.PromiseState === 'reject') {
            callback(onRejected)
        }
        if (this.PromiseState === 'pending') {
            this.callbacks.push({
                onResolved: function () {
                    callback(onResolved)
                },
                onRejected: function () {
                    callback(onRejected)
                },
            })
        }
    })
}
Promise.prototype.catch = function(onRejected){
    return this.then(undefined,onRejected)
}
Promise.resolve = function(value){
    return new Promise((resolve,reject) => {
        if(value instanceof promise){
            value.then(v => {
                resolve(v)
            },r => {
                reject(r)
            })
        }else{
            resolve(value)
        }
    })
}
Promise.reject = function(reason){
    return new Promise((resolve,reject) => {
        reject(reason)
    })
}
Promise.all = function(promises){
    return new Promise((resolve,reject) => {
        let count = 0;
        let arr = [];
        for(let i = 0;i < promises.length; i++){
            promises[i].then(v => {
                arr[i] = v;
                count++;
                if(count === promises.length){
                    resolve(arr);
                }
            },r => {
                reject(r);
            })
        }
    })
}