Promise 及其基于 Typescript 的实现




// 定义一个简单的Promise
class SimplePromise<T> {
    private _state: 'pending' | 'resolved' | 'rejected' = 'pending';
    private _value: T | undefined;
    private _reason: any | undefined;
    private _onResolveCallbacks: Array<(value: T) => void> = [];
    private _onRejectCallbacks: Array<(reason: any) => void> = [];
 
    // 构造函数接收一个函数,该函数接收两个函数参数resolve和reject
    constructor(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) {
        executor(this.resolve.bind(this), this.reject.bind(this));
    }
 
    // 使实例可被调用,类似于then方法
    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): SimplePromise<TResult1 | TResult2> {
        let promise2 = new SimplePromise<TResult1 | TResult2>((resolve, reject) => {
            if (this._state === 'pending') {
                this._onResolveCallbacks.push(value => {
                    try {
                        let result = onfulfilled ? onfulfilled(value) : value;
                        resolve(result);
                    } catch (e) {
                        reject(e);
                    }
                });
                this._onRejectCallbacks.push(reason => {
                    try {
                        let result = onrejected ? onrejected(reason) : reason;
                        resolve(result);
                    } catch (e) {
                        reject(e);
                    }
                });
            } else if (this._state === 'resolved') {
                try {
                    let result = onfulfilled ? onfulfilled(this._value) : this._value;
                    resolve(result);
                } catch (e) {
                    reject(e);
                }
            } else {
                try {
                    let result = onrejected ? onrejected(this._reason) : this._reason;
                    resolve(result);
                } catch (e) {
                    reject(e);
                }
            }
        });
        return promise2;
    }
 
    // 设置Promise为resolved状态
    private resolve(value: T | PromiseLike<T>) {
        const resolve = (value: T) => {
            if (this._state === 'pending') {
                this._state = 'resolved';
                this

评论已关闭

推荐阅读

Vue中使用mind-map实现在线思维导图
2024年08月04日
VUE
Web前端最全Vue实现免密登录跳转的方式_vue怎么样不登录返回首页,最强技术实现
2024年08月04日
VUE
vue3 项目搭建教程(基于create-vue,vite,Vite + Vue)
2024年08月04日
VUE
Vue-颜色选择器实现方案——>Vue-Color( 实战*1+ Demo*7)
2024年08月04日
VUE
Vue项目卡顿慢加载?这些优化技巧告诉你!_vue数据多渲染卡顿
2024年08月04日
VUE
vue中的keep-alive详解与应用场景
2024年08月04日
VUE
Vue、React实现excel导出功能(三种实现方式保姆级讲解)
2024年08月04日
vue-office/docx插件实现docx文件预览
2024年08月04日
VUE
java调用js文件的两种方法(支持V8引擎)
2024年08月04日
JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
2024年08月04日
两周从爬虫小白变大神 _yjs_js_security_passport
2024年08月04日
JS笔记(对象、函数、数组)
2024年08月04日
Markdown.js:强大的纯JavaScript Markdown解析器
2024年08月04日
Vue项目:js模拟点击a标签下载文件并重命名,URL文件地址下载方法、请求接口下载文件方法总结。
2024年08月04日
vue 父组件怎么获取子组件里面的data数据
2024年08月04日
VUE
个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)
2024年08月04日
el-table 表格封装并改造实现单元格可编辑
2024年08月04日
none
nodejs环境下创建vue项目、SSH密钥登陆!!!
2024年08月04日
vue+quill+element-ui实现视频、图片上传及缩放保姆级教程,轻松使用富文本
2024年08月04日
【three.js】22. Imported Models导入模型
2024年08月04日