首页 > 其他分享 >手写Promise实现(不包含静态方法)

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

时间:2024-09-17 23:20:43浏览次数:10  
标签:resolve 静态方法 reject promise2 Promise result error const 手写

手写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;
    }

}

标签:resolve,静态方法,reject,promise2,Promise,result,error,const,手写
From: https://blog.csdn.net/YJGGZHK/article/details/142320861

相关文章

  • JavaScript 手写new操作符
    new关键字的工作步骤创建一个新的对象obj将对象与构建函数通过原型链连接起来将构建函数中的this绑定到新建的对象obj上根据构建函数返回类型作判断,如果是原始值则被忽略,如果是返回对象,需要正常处理constrecodeNew=function(Func,...args){//获取函数对象......
  • Spring4-IoC3-手写IoC
    Spring框架的IoC是基于Java反射机制实现的Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。简单来说,反射机制指的是程序在运行时......
  • 前端基本功——搞懂Promise
    写在前面:大家好,我是山里看瓜,该系列文章是为了帮助大家不管面试还是开发对前端的一些基本但是很重要的知识点认识更加深入和全面。想写这个系列文章的初衷是:我发现前端的很多基本知识,使用起来很简单,定义看起来也很简单。很多人你在问他相关问题的时候,他也能说上几句。但是为什么......
  • 前端基本功——面试必问系列(1):都2024了,还没吃透Promise?一文搞懂
    写在前面:大家好,我是山里看瓜,该系列文章是为了帮助大家不管面试还是开发对前端的一些基本但是很重要的知识点认识更加深入和全面。想写这个系列文章的初衷是:我发现前端的很多基本知识,使用起来很简单,定义看起来也很简单。很多人你在问他相关问题的时候,他也能说上几句。但是为什么......
  • WPF 尝试使用 WinML 做一个简单的手写数字识别应用
    最近我看了微软的AI训练营之后,似乎有点了解WindowsMachineLearning和DirectML的概念,于是我尝试实践一下,用WPF写一个简单的触摸手写输入的画板,再使用大佬训练好的mnist.onnx模型,对接WinML实现一个简单的手写数字识别应用本文属于WinML的入门级博客,我将尝试一步步......
  • 机器学习之手写阿拉伯数字识别
    样本:github.com/mc6666/Kera…markdown代码解读复制代码#手写阿拉伯数字识别本项目将使用TensorFlow和Keras构建一个卷积神经网络(CNN)模型来识别手写阿拉伯数字。以下是各个步骤的详细说明。python代码解读复制代码#导入必要的库importtensorflowastfimp......
  • 深度学习|模型训练:手写 SimpleNet
    文章目录引言SimpleNet网络结构激活函数损失函数梯度计算SimpleNet类权重参数模型推理损失计算梯度计算SimpleNet概览模型训练数据准备训练过程结语引言从前文「深度学习|梯度下降法:误差最小化的权重参数」,我们知道了神经网络的学习就是“找寻使损失函数的值尽......
  • 用父类的对象引用子类对象中重写的方法 静态方法重写
    用父类的对象引用子类对象中重写的或继承的方法比如,以下程序中,Shape是抽象类,Circle和Rectangle是子类,均重写了抽象方法//定义抽象类publicabstractclassShape{//定义2个抽象方法publicabstractdoubleGetArea();publicabstractdoubleGetCircum();//定义普通方法p......
  • 静态成员、静态方法、静态代码块
    静态成员      静态数据成员是属于类的,并且为这个类所有对象共享,只占一块内存空间、      随着类的加载而先创建出来,然后对象才被创建出来。      一般是通过类名去访问去访问、修改,不推荐,(因为如果用对象去访问,结果可能被覆盖,后续可能混......
  • 【SpringBoot】静态方法获取 bean的
    背景:使用springboot,要从spring容器里面取到一个bean,那是很容易的。但从静态方法里面取出一个bean,有什么方法呢?比如:场景1:要写一个工具类,可以提供静态方法去获取一个bean。场景2:要写一个工具类,可以提供静态方法去获取一个bean,并且这个工具类不能给spring管理(因为常规操作,交给......