手写Promise实现(不包含静态方法)

手写Promise实现

#基本promise 不包含 all 等方法

定义状态常量

const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';

封装函数,将同步任务放入微任务队列

function runsynctask(callback) {
    return queueMicrotask(callback);
}

resolvePromise 函数

function resolvePromise(promise2, x, resolve, reject) {
    if (x === promise2) {
        throw new TypeError('Chaining cycle detected for promise');
    }
    if (x instanceof NewPromise) {
        x.then(res => resolve(res), err => reject(err));
    } else {
        resolve(x);
    }
}

NewPromise 类

class NewPromise {
    state = PENDING;
    result = null;
    #handlers = [];

    constructor(func) {
        const resolve = (result) => {
            if (this.state === PENDING) {
                this.state = FULFILLED;
                this.result = result;
                this.#handlers.forEach(handler => {
                    handler.onFulfilled(result)
                })
            }
        }
        const reject = (error) => {
            if (this.state === PENDING) {
                this.state = REJECTED;
                this.result = error;
                this.#handlers.forEach(handler => {
                    handler.onRejected(error)
                })
            }
        }
        func(resolve, reject);
    }

    then(onFulfilled, onRejected) {
        typeof onFulfilled === 'function' ? onFulfilled : (value) => value;
        typeof onRejected === 'function' ? onRejected : (error) => { throw error };
        const promise2 = new NewPromise((resolve, reject) => {
            if (this.state === FULFILLED) {
                runsynctask(() => {
                    try {
                        const x = onFulfilled(this.result);
                        resolvePromise(promise2, x, resolve, reject)
                    } catch (error) {
                        reject(error);
                    }
                })
            } else if (this.state === REJECTED) {
                runsynctask(() => {
                    try {
                        const x = onRejected(this.result);
                        resolvePromise(promise2, x, resolve, reject)
                    } catch (error) {
                        reject(error);
                    }
                })
            } else if (this.state == PENDING) {
                this.#handlers.push({
                    onFulfilled: () => {
                        runsynctask(() => {
                            try {
                                const x = onFulfilled(this.result);
                                resolvePromise(promise2, x, resolve, reject)
                            } catch (error) {
                                reject(error);
                            }
                        })
                    },
                    onRejected: () => {
                        runsynctask(() => {
                            try {
                                const x = onRejected(this.result);
                                resolvePromise(promise2, x, resolve, reject)
                            } catch (error) {
                                reject(error);
                            }
                        })
                    }
                })
            }
        })
        return promise2;
    }
}

完整代码

//定义状态常量
const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';
//封装函数,将同步任务放入微任务队列
function runsynctask(callback) {
    return queueMicrotask(callback);
}
resolvePromise = (promise2, x, resolve, reject) => {
    if (x === promise2) {
        throw new TypeError('Chaining cycle detected for promise');
    }
    //判断x是否为promise
    if (x instanceof NewPromise) {
        x.then(res => resolve(res), err => reject(err));
    } else {
        resolve(x);
    }

}


class NewPromise {
    //状态
    state = PENDING;
    //结果
    result = null;
    //存储onFulfilled和onRejected
    #handlers = [];

    //构造函数
    constructor(func) {
        //定义resolve和reject函数
        const resolve = (result) => {
            //状态为pending时,改变状态和结果 实现不可逆
            if (this.state === PENDING) {
                this.state = FULFILLED;
                this.result = result;
                //执行存储的onFulfilled
                this.#handlers.forEach(handler => {
                    handler.onFulfilled(result)
                })
            }
        }
        const reject = (error) => {
            //状态为pending时,改变状态和结果 实现不可逆
            if (this.state === PENDING) {
                this.state = REJECTED;
                this.result = error;
                //执行存储的onRejected
                this.#handlers.forEach(handler => {
                    handler.onRejected(error)
                })
            }
        }
        func(resolve, reject)//执行传入的函数

    }
    then(onFulfilled, onRejected) {
        //如果onFulfilled不是函数,则将其设置为函数,返回结果
        typeof onFulfilled === 'function' ? onFulfilled : (value) => value;
        //如果onRejected不是函数,则将其设置为函数,抛出错误
        typeof onRejected === 'function' ? onRejected : (error) => { throw error };
        const promise2 = new NewPromise((resolve, reject) => {
            if (this.state === FULFILLED) {
                runsynctask(() => {
                    try {
                        const x = onFulfilled(this.result);
                        //判断x是否为promise2
                        resolvePromise(promise2, x, resolve, reject)

                    } catch (error) {
                        reject(error);
                    }
                })

            } else if (this.state === REJECTED) {
                runsynctask(() => {
                    try {
                        const x = onRejected(this.result);
                        //判断x是否为promise2
                        resolvePromise(promise2, x, resolve, reject)

                    } catch (error) {
                        reject(error);
                    }

                })

            } else if (this.state == PENDING) {
                this.#handlers.push({
                    onFulfilled: () => {
                        runsynctask(() => {
                            try {
                                const x = onFulfilled(this.result);
                                //判断x是否为promise2
                                resolvePromise(promise2, x, resolve, reject)

                            } catch (error) {
                                reject(error);
                            }
                        })
                    },
                    onRejected: () => {
                        runsynctask(() => {
                            try {
                                const x = onRejected(this.result);
                                //判断x是否为promise2
                                resolvePromise(promise2, x, resolve, reject)

                            } catch (error) {
                                reject(error);
                            }

                        })
                    }
                })
            }
        })
        return promise2;
    }

}

引用\[1\]中提到了在回调函数中返回一个pending状态的promise对象的方法,这是因为在promise链中,执行then方法的成功或失败回调取决于上一个promise的状态。如果中间返回一个初始状态的promise对象,then方法无法确定执行哪个回调,后续的then方法也不会执行,导致promise链中断。 引用\[2\]中提到了手写Promise的方法。为了实现链式调用,我们需要在第一个then方法中返回一个新的promise对象。根据官方规定,我们可以在then方法中创建一个新的promise对象,并将其命名为promise2。然后,我们可以将promise2返回的值传递给下一个then方法。如果返回的是一个普通值,则将该值传递给下一个then方法。 引用\[3\]中给出了一个基本的Promise实现的示例代码。首先,我们使用class关键字声明一个Promise类,并在构造函数中传入一个参数(executor函数)。executor函数有两个参数,resolve和reject,分别表示成功和失败。在executor函数中,我们可以执行异步操作,并在适当的时候调用resolve或reject来改变Promise的状态。根据官方规定,Promise存在三个状态:pending(等待态)、fulfilled(成功态)和rejected(失败态)。成功时,Promise的状态不可再次改变,并且需要有一个不可改变的值。失败时,Promise的状态也不可再次改变,并且需要有一个不可改变的原因。如果executor函数报错,直接执行reject()。 综上所述,手写Promise实现需要注意返回一个新的promise对象,并在适当的时候调用resolve或reject来改变Promise的状态。 #### 引用[.reference_title] - *1* *2* *3* [Promise学习笔记(尚硅谷)](https://blog.csdn.net/Ch_ensf/article/details/124699879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值