首页 > 其他分享 >手写Promise——基于es6的Promise实现(含详细注释)

手写Promise——基于es6的Promise实现(含详细注释)

时间:2022-10-04 17:02:47浏览次数:69  
标签:STATUS es6 resolve Promise reject promise 手写 data

 

 

1. Promise A+ 规范

2. 代码实现

github地址:​​https://github.com/whu-luojian/Promise.git​


// promise的状态枚举

const STATUS = {

PENDING: 0,

FULFILLED: 1,

REJECTED: 2

}

class Promise {

constructor(task) {

// promise初始状态

this.status = STATUS.PENDING;

// resolve时返回的数据

this.resolveData = null;

// reject时返回的数据

this.rejectData = null;

// resolve和reject时执行的回调队列

// promise的resolve和reject为异步响应时,即调用then时promise为

// pending状态,则将传入then的函数加入该队列,等待promise resolve或

// reject时执行该队列

this.onFulfilledList = [];

this.onRejectedList = [];

/**

* promise成功,执行onFulfilledList回调

* @param {*} data

*/

this.onResolve = (data) => {

if(this.status === STATUS.PENDING) {

this.status = STATUS.FULFILLED;

this.resolveData = data;

this.onFulfilledList.forEach(fn => {

fn(this.resolveData)

})

}

}

/**

* promise失败,执行onRejectedList回调

* @param {*} err

*/

this.onReject = (err) => {

if(this.status === STATUS.PENDING) {

this.status = STATUS.REJECTED;

this.rejectData = err;

this.onRejectedList.forEach(fn => {

fn(this.rejectData)

})

}

}

/**

* promise解析, 根据then 返回数据类型不同封装不同的promise

* 返回,以便实现then的链式调用及Promise的thenable特性

* @param {*当前then return数据} data

* @param {*当前then的resolve} resolve

* @param {*当前then的reject} reject

*/

this.resolvePromise = (data, resolve, reject) => {

// then return 的数据是一个promise

if(data instanceof Promise) {

if(data.status === STATUS.PENDING) {

data.then((val) => {

this.resolvePromise(val, resolve, reject);

}, reject)

} else if (data.status === STATUS.FULFILLED) {

resolve(data.resolveData)

} else {

reject(data.rejectData)

}

}

// then return的是一个对象,若对象具有then方法,则可使用此方法作为新的then

// Promise的thenable特性基于此

else if(data !== null && data instanceof Object) {

try {

let then

标签:STATUS,es6,resolve,Promise,reject,promise,手写,data
From: https://blog.51cto.com/u_15689678/5731386

相关文章

  • 用PyTorch搭建LeNet-5手写识别
    用PyTorch搭建LeNet-5手写识别首先申明,这篇博客用于记录本人看完LeNet-5论文,并对其中的算法进行复现的记录,可以看成是学习笔记在此推荐一个b站up的视频从0开始撸代码--手......
  • 手写现代前端框架diff算法-前端面试进阶
    前言在前端工程上,日益复杂的今天,性能优化已经成为必不可少的环境。前端需要从每一个细节的问题去优化。那么如何更优,当然与他的如何怎么实现的有关。比如key为什么不能使用......
  • 几个常见的javascript手写题,你能写出来几道
    实现new过程:要点:函数第一个参数是构造函数实例的__proto__指向构造函数的原型属性prototype函数剩余参数要挂载到一个实例对象上构造函数有返回值时,就返回这个返回......
  • ES6中set的用法
    ES6中的set类似一个数组,但是其中的值都是唯一的,Set本身是一个构造函数,用来生成Set数据结构。set函数可以接受一个数组作为参数,用来初始化:constset=newSet([1,2,......
  • Java手写实现链表队列和数组队列【数据结构与算法】
    packagealgorithm;/**@authorAdministrator@date2022-09-1317:50*/publicclassQueueLinked{privatestaticclassNode{Eitem;Nodenext;publicNode(Eitem,N......
  • Java手写实现栈【数据结构与算法】
    packagealgorithm;importjava.util.Arrays;importjava.util.Iterator;/**@authorAdministrator@date2022-09-1216:38数组栈*/publicclassMyArrayStack{//定义......
  • js进阶手写常见函数
    JavaScript进阶的必要性无论是学习react还是vue,它们都是js的应用框架。剥去他们的壳子看到的始终是js,所以作为一个前端大厨必须要熟练掌握好js这个大勺,才能烧出一顿好菜无......
  • js进阶手写常见函数
    JavaScript进阶的必要性无论是学习react还是vue,它们都是js的应用框架。剥去他们的壳子看到的始终是js,所以作为一个前端大厨必须要熟练掌握好js这个大勺,才能烧出一顿好菜......
  • cnpm使用 install报错throw err;^Error: Cannot find module 'fs/promises
    cnpm使用install报错throwerr;^Error:Cannotfindmodule'fs/promises这个问题主要是node的版本和cnpm的版本不匹配--检查一下项目中的node版本和cnpm版本:cnpm的......
  • JS Promise 异步编程
    JavaScriptPromise异步编程概述Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言......