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就是构造函数
使用是发布订阅模式
我们定义三个状态

// pending
const PENDING = "pending"

// 成功的回调状态
const FULFILLED = "fulfilled"

// 失败的回调状态
const REJECTED = "rejected"

代码里面的注释,可以看下

class Promise {
    constructor(executor) {
        this.status = PENDING
        // 成功传递的参数
        this.value = undefined
        // 失败传递的参数
        this.reson = undefined
        // 用来存放成功的函数
        this.resolveCall = []
        // 用来存放失败的函数
        this.rejectCall = []
        let resolve = (value) => {
           // 保证只在pending状态时调用
            if (this.status === PENDING) {
                this.status = FULFILLED
                this.value = value
                // 成功的发布
                this.resolveCall.forEach((fn=> {
                    fn()
                }))
            }
        }
        let reject = (reson) => {
            if (this.status === PENDING) {
                this.status = REJECTED
                this.reson = reson
                // 失败的发布
                this.rejectCall.forEach((fn=> {
                    fn()
                }))
            }
        }
        // try catch 的作用保证 throw 抛出错误时调用reject函数
        try {
            executor(resolve, reject)
        } catch (error) {
            reject(error)
        }
    }
	// new Promise后调用这个方法
    then(onResolve, onReject) {
        if (this.status === FULFILLED) {
            onResolve(this.value)
        }
        if (this.status === REJECTED) {
            onReject(this.reson)
        }
        // 这个是处理异步的方法
        if(this.status === PENDING) {
        	// 成功的订阅
            this.resolveCall.push(()=> {
                onResolve(this.value)
            })
            // 失败的订阅
            this.rejectCall.push(()=> {
                onReject(this.reson)
            })
        }

    }
}

module.exports = Promise

这里有一点可能会有一点难以理解
p.then调用后 this.status === PENDING 其实就是宏观任务最后执行
关于这个异步调用可能有一点难以理解的, 加强一下事件循环机制就好了

let Promise = require('./promise.js')
let p = new Promise((resolve, reject) => {
    // reject('error')
    // resolve('value')
    // throw new Error('报错了')
    setTimeout(() => {
        resolve('value')
    }, 1000);

})
p.then((success) => {
    console.log(success);
}, (err) => {
    // console.log(err);
})

参考视频源码链接
https://www.bilibili.com/video/BV1LE411G7mS?p=2

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:31:32  更:2022-05-09 12:32:21 
 
开发: 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年11日历 -2024/11/23 23:10:42-

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