IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 面试官:怎么手撸一个promise? -> 正文阅读

[JavaScript知识库]面试官:怎么手撸一个promise?

前段时间面试时面试官问了我如何手写一个promise,心想只手写过promise的api,那如果直接手写promise应该从哪做起呢?

Promise结构&特性

结构:
1、Promise对象创建一个异步函数
2、异步函数中有resolvereject两个函数参数
3、Promise中的fulfilledpendingrejected三种状态
4、Promise的.then执行回调返回新的Promise
5、Promise的链式编程
特性:
1、主动抛出错误,会调用 reject() 方法回调。
2、.then 中传入非函数参数,不会报错。

实现思路

1、用class类或构造函数实现Promise对象。
2、自定义resolvereject方法。
3、定义三种状态,且一旦确定后不可改变。
4. then 执行回调结果。
5. 异步执行:使用定时器执行 .then 回调。
6. 链式执行:让 .then 返回一个新的 Promise 来实现链式编程。
7. 使用 try-catch 来判断代码有无主动抛出一个错误。
8. 对 .then 中传入的参数进行非函数判断,如果不为函数则将其回调赋值为一个空对象。

实现

1、

class myPromise {
    static PENDING = '待定';
    static FULFILLED = '完成';
    static REJECTED = '拒绝';
    constructor(func) {
            this.status = myPromise.PENDING;
            this.result = null;
            // 防止this丢失 创建实例后调用方法找不到this,使用bind绑定 
            //try catch 当出现错误时,把errormsg直接交给reject
            //保存resolve 和 reject的回调
            this.resolveCallbacks = [];
            this.rejectCallbacks = [];
            try {
                func(this.resolve.bind(this), this.reject.bind(this));
            } catch (error) {
                this.reject(error)
            }

        }
        //resolve方法
        //resolve 和 reject是在事件循环末尾执行的 所以加上settimeout
    resolve(result) {
            setTimeout(() => {
                if (this.status === myPromise.PENDING) {
                    this.status = myPromise.FULFILLED;
                    this.result = result;
                    this.resolveCallbacks.forEach(callback => {
                        callback(result)
                    })
                }
            });

        }
        //result方法
    reject(result) {
            setTimeout(() => {
                if (this.status === myPromise.PENDING) {
                    this.status = myPromise.REJECTED;
                    this.result = result;
                    this.rejectCallbacks.forEach(callback => {
                        callback(result)
                    })
                }
            });

        }
        //then 方法
    then(onFULFILLED, onREJECTED) {
        //链式
        return new myPromise((resolve,reject)=>{
            onFULFILLED = typeof onFULFILLED === 'function' ? onFULFILLED : () => {};
            onREJECTED = typeof onREJECTED === 'function' ? onREJECTED : () => {};
            if (this.status === myPromise.PENDING) {
                this.resolveCallbacks.push(onFULFILLED);
                this.rejectCallbacks.push(onREJECTED);
    
            }
            if (this.status === myPromise.FULFILLED) {
                setTimeout(() => {
                    onFULFILLED(this.result);
                })
    
            }
            if (this.status === myPromise.REJECTED) {
                setTimeout(() => {
                    onREJECTED(this.result);
                });
    
            }
        })
       
    }
}
console.log(1);
let mp = new myPromise((resolve, reject) => {
    console.log(2);
    setTimeout(() => {
        resolve('haha')
        console.log(4);
    });

})

mp.then((res) => {
    console.log(res);
}, (err) => {
    console.log(err);
})
console.log(3);
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:19:03  更:2021-11-10 12:20:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 4:44:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码