自定义Promise

class Promise {

    constructor(executor) {

        // 成功状态

        // [[PromiseState]]: "fulfilled"

        // [[PromiseResult]]: "ok"

        this.PromiseState = 'pending'

        this.PromiseResult = null

        // 声明回调

        this.callbacks = []

        const _this = this

        // console.log(_this)

        // resolve

        function resolve(data) {



            // console.log(_this)

            if (_this.PromiseState !== 'pending') return

            _this.PromiseResult = data

            _this.PromiseState = 'fulfilled'

   

            setTimeout(() => {

                _this.callbacks.forEach(item => {

                    item.resolved(data)

                })

            })

        }

        // reject

        function reject(data) {



            if (_this.PromiseState !== 'pending') return

            //         [[PromiseState]]: "rejected"

            //          [[PromiseResult]]: "ok"

            _this.PromiseResult = data

            _this.PromiseState = 'rejected'



            // if(_this.callback.rejected){

            //     _this.callback.rejected(data)

            // }

            setTimeout(() => {

                _this.callbacks.forEach(item => {

                    item.rejected(data)

                })

            })

        }

        // 同步调用执行器函数

        try {

            executor(resolve, reject)

        } catch (e) {

            reject(e)

        }

    }

    then(resolved, rejected) {



    }






    then(resolved, rejected) {

        if (typeof rejected !== 'function') {

            rejected = reason => {

                throw reason

            }

        }

        if (typeof resolved !== 'function') {

            resolved = value => value

        }



        return new Promise((resolve, reject) => {

            const _this = this

            function callback(type) {

                try {

                    let result = type(_this.PromiseResult)

                    // resolved(this.PromiseResult)

                    // 不属于promise对象,返回fulfilled

                    if (result instanceof Promise) {

                        result.then(value => {

                            resolve(value)

                        }, reason => {

                            reject(reason)

                        })

                    } else {

                        resolve(result)

                    }

                } catch (e) {

                    reject(e)

                }



            }

            if (this.PromiseState == 'fulfilled') {

                setTimeout(() => {

                    callback(resolved)

                })




            }

            if (this.PromiseState == 'rejected') {

                // callback(rejected)

                setTimeout(() => {

                    callback(rejected)

                })

            }

            if (this.PromiseState == 'pending') {

                // 保存回调函数

                this.callbacks.push({

                    resolved: function () {

                        // console.log('succuss')

                        setTimeout(() => {

                            callback(resolved)

                        })



                    },

                    rejected: function () {



                        setTimeout(() => {

                            callback(rejected)



                        });

                    }

                })



            }

        })



    }

    catch(onRejected) {

        return this.then(undefined, onRejected)

    }

    static resolve(value) {

        return new Promise((resolve, reject) => {

            if (value instanceof Promise) {

                value.then(v => {

                    resolve(v)

                }, r => {

                    reject(r)

                })

            } else {

                resolve(value)

            }

        })

    }

    static reject(reason) {

        return new Promise((resolve, reject) => {

            reject(reason)

        })

    }

    static all(promises) {

        return new Promise((resolve, reject) => {

            let count = 0

            let arr = []

            for (let i = 0; i < promises.length; i++) {

                promises[i].then(v => {

                    count++

                    arr[i] = promises[i]

                    if (count == promises.length) {

                        resolve(arr)

                    }

                }, reject => {

                    reject(reject)

                })

            }

        })

    }

    static race(promises) {

        return new Promise((resolve, reject) => {



            for (let i = 0; i < promises.length; i++) {

                promises[i].then(v => {

                    resolve(v)

                }, j => {

                    reject(j)

                })

            }

        })

    }

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值