手写Promise

class HD {
        static PENDING = 'pending'
        static FUIFUILED = 'fulfiled'
        static REJECTED = 'rejected'
        constructor(executor) {
            this.status = HD.PENDING;
            this.value = null;
            this.callbacks = [];
            executor(this.resolve.bind(this), this.reject.bind(this))
        }
        resolve(value) {
            if (this.status == HD.PENDING) {
                this.status = HD.FUIFUILED;
                this.value = value;
                setTimeout(() => {
                    this.callbacks.map(el => {
                        el.onSuccess()
                    })
                })
            }

        }
        reject(error) {
            if (this.status == HD.PENDING) {
                this.status = HD.REJECTED;
                this.value = error;
                setTimeout(() => {
                    this.callbacks.map(el => {
                        el.onError()
                    })
                })
            }
        }
        then(onSuccess, onError) {
            if (typeof onSuccess != 'function') {
                onSuccess = () => this.value//值穿透
            }
            if (typeof onError != 'function') {
                onError = () => this.value//值穿透
            }
            let promise = new HD((resolve, reject) => {
                if (this.status == HD.PENDING) {
                    this.callbacks.push({
                        onSuccess: () => {
                            this.parse(promise, onSuccess(this.value), resolve, reject)
                        },
                        onError: () => {
                            let result = onError(this.value)
                            resolve(result)
                        }
                    });
                }
                if (this.status == HD.FUIFUILED) {
                    setTimeout(() => {
                        this.parse(promise, onSuccess(this.value), resolve, reject)
                    })
                }
                if (this.status == HD.REJECTED) {
                    setTimeout(() => {
                        this.parse(promise, onError(this.value), resolve, reject)
                    })
                }
            });
            return promise;
        }
        parse(promise, result, resolve, reject) {
            //引入promise是因为promise不能返回它自己
            if (promise == result) {
                throw new Error('完全错误')
            }
            try {
                if (result instanceof HD) {
                    result.then(resolve, reject)
                } else {
                    resolve(result)
                }
            } catch (error) {
                reject(error)
            }

        }
        static resolve(value) {
            return new HD((onFulfiled, onReject) => {
                if (value instanceof HD) {
                    value.then(onFulfiled, onReject)
                } else {
                    onFulfiled(value)
                }
            })
        }
        static reject(value) {
            return new HD((onFulfiled, onReject) => {
                if (value instanceof HD) {
                    value.then(onFulfiled, onReject)
                } else {
                    onReject(value)
                }
            })
        }
        static all(promises) {
            let values = []
            return new HD(((resolve, reject) => {
                promises.map(el => {
                    el.then(res => {
                        values.push(res);
                        if (values.length == promises.length) {
                            resolve(values)
                        }
                    }, error => {
                        reject(error)
                    })
                })
            }))
        }
        static race(promises) {
            return new HD((resolve, reject) => {
                promises.map(el => {
                    el.then(res => {
                        resolve(res);
                    }, error => {
                        reject(error);
                    })
                })
            })
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的手写Promise的示例: ```javascript class Promise { constructor(executor) { this.state = 'pending'; this.value = undefined; this.reason = undefined; this.onResolveCallbacks = []; this.onRejectCallbacks = []; const resolve = (value) => { if (this.state === 'pending') { this.state = 'fulfilled'; this.value = value; this.onResolveCallbacks.forEach(callback => callback()); } }; const reject = (reason) => { if (this.state === 'pending') { this.state = 'rejected'; this.reason = reason; this.onRejectCallbacks.forEach(callback => callback()); } }; try { executor(resolve, reject); } catch (error) { reject(error); } } then(onFulfilled, onRejected) { const fulfilledHandler = typeof onFulfilled === 'function' ? onFulfilled : value => value; const rejectedHandler = typeof onRejected === 'function' ? onRejected : reason => { throw reason; }; const promise2 = new Promise((resolve, reject) => { const fulfillHandlerWrapper = () => { setTimeout(() => { try { const result = fulfilledHandler(this.value); resolvePromise(promise2, result, resolve, reject); } catch (error) { reject(error); } }, 0); }; const rejectHandlerWrapper = () => { setTimeout(() => { try { const result = rejectedHandler(this.reason); resolvePromise(promise2, result, resolve, reject); } catch (error) { reject(error); } }, 0); }; if (this.state === 'fulfilled') { fulfillHandlerWrapper(); } else if (this.state === 'rejected') { rejectHandlerWrapper(); } else { this.onResolveCallbacks.push(fulfillHandlerWrapper); this.onRejectCallbacks.push(rejectHandlerWrapper); } }); return promise2; } catch(onRejected) { return this.then(null, onRejected); } } function resolvePromise(promise, result, resolve, reject) { if (promise === result) { return reject(new TypeError('Chaining cycle detected for promise')); } let thenCalledOrThrow = false; if (result instanceof Promise) { result.then( value => resolvePromise(promise, value, resolve, reject), reason => reject(reason) ); } else if (result !== null && (typeof result === 'object' || typeof result === 'function')) { try { const then = result.then; if (typeof then === 'function') { then.call( result, value => { if (thenCalledOrThrow) return; thenCalledOrThrow = true; resolvePromise(promise, value, resolve, reject); }, reason => { if (thenCalledOrThrow) return; thenCalledOrThrow = true; reject(reason); } ); } else { resolve(result); } } catch (error) { if (thenCalledOrThrow) return; thenCalledOrThrow = true; reject(error); } } else { resolve(result); } } ``` 这只是一个基本的实现,还有很多细节和功能可以改进。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值