教你一步步实现一个简易promise


Posted in Javascript onNovember 02, 2021

step1 搭建框架

1. 首先我们需要在这里放置一个promise函数本体 后面要在里面添加resolve、reject的执行函数

function Promise(execotor) {}

2. 原装promise中有then与catch这两个主要的方法,所以我们要给promise的原型挂载then与catch

Promise.prototype.then = function (onResolved, onRejected) {}
  Promise.prototype.catch = function (onRejected) {}

3. 给promise挂载几个常见方法 resolve、reject、all、race等等

resolve:返回的是一个指定结果的promise对象

Promise.resolve = function (value) { }

reject:返回失败状态的方法

Promise.reject = function (value) { }

all:返回一个promise对象,只有当promise都返回的时候,这个状态才算成功

Promise.all = function (value) { }

race:返回一个promise对象,它的状态是由第一个返回的对象确定的,这个race里面哪个函数先执行完,就直接返回第一个值,其他的继续执行

Promise.race = function (value) { }

4. 全局声明mypromise

window.Promise = Promise

5. 建立一个自执行函数 将上述内容全部包裹进去

(function (window) {

})()

step2 填充搭建好了的Promise框架

1.填充function Promise()

(1)let self = this固定一个function内部的this,这个this在后面会发挥很大作用

(2)self.status = 'pending'为Promise函数本体添加一个基础状态‘pending'

(3)self.data = undefined建立一个data源,用来存储resolve传回来的结果

(4)self.callbacks = []建立一个数组,用来将promise中的回调全部保存起来

2.填充function resolve()

(1)        if (self.status !== 'pending') {           return         }判断当前传入进程的状态是否为pending,是就继续下面的操作,不是就直接返回

promise内部有三种状态pending、resolved、rejected,这三种状态都是一种开关变量,如果该状态从pending转为其他状态后将无法改变。

(2)self.status = 'resolved'将该进程的状态改为resolved

(3)self.data = value将value存起来,待会then中的回调会需要使用该数据

(4)放上最重要的执行函数部分,如果sele.data中有待执行的callback函数,立即异步执行它

if (self.callbacks.length > 0) {
      setTimeout(() => {
        self.callbacks.forEach(callbackObj => {
          callbackObj.onResolved(value)
        })
      }, 0)
    }

3.填充function reject()

(1) 与resolve函数相同,此处简略

4.填充execotor方法

promise主体在执行时如果出错,错误信息被catch捕捉,此时catch会跳至该函数来单独执行一个reject

try {
       execotor(resolve, reject)
     } catch (error) {
       reject(error)
     }

5.填充.then函数

首先我们要区分传入进程的状态,如果是pending状态就把回调函数存起来,如果不是pending状态就干点什么它应该做的

(1)if (self.status === 'pending')如果当前的状态是pending的话,我们就把它保存起来

self.callbacks.push({
      onResolved() { onResolved(self.data) },
      onRejected() { onRejected(self.data) }
    })

(2)else if (self.status === 'resolved')如果status的状态是resolved

我们就开开心心的给它执行一下

setTimeout(() => {
      onResolved(self.data)
    }, 0)

可是有这么一种状态:resolve没有执行,但此时状态却已经改变了,我们就不能执行resolve而改为执行rejected

else{
     setTimeout(() => {
       onRejecyed(self.data)
     }, 0)
   }

经过了如同怎么把大象塞进冰箱一样“简略”的两步,我们就实现了一个简易的Promise                        

是不是很简单呀,快叫上身边的小伙伴一起来试一试吧!

总结

到此这篇关于实现一个简易promise的文章就介绍到这了,更多相关实现简易promise内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
无语,javascript居然支持中文(unicode)编程!
Apr 12 Javascript
window.location.hash 属性使用说明
Mar 20 Javascript
jQuery Chart图表制作组件Highcharts用法详解
Jun 01 Javascript
js生成随机数(指定范围)的实例代码
Jul 10 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
Aug 23 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
Mar 29 Javascript
Node中使用ES6语法的基础教程
Jan 05 Javascript
vue 微信授权登录解决方案
Apr 10 Javascript
angular1.x ui-route传参的三种写法小结
Aug 31 Javascript
layui使用form表单实现post请求页面跳转的方法
Sep 14 Javascript
Vue绑定用户接口实现代码示例
Nov 04 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
Feb 10 Javascript
一定要知道的 25 个 Vue 技巧
原型和原型链 prototype和proto的区别详情
Nov 02 #Javascript
浅谈克隆 JavaScript
Nov 02 #Javascript
WebWorker 封装 JavaScript 沙箱详情
quickjs 封装 JavaScript 沙箱详情
Nov 02 #Javascript
js 数组 fill() 填充方法
浅谈 JavaScript 沙箱Sandbox
You might like
使用php4加速网络传输
2006/10/09 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
微信小程序实战之运维小项目
2017/01/17 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
python实现下载整个ftp目录的方法
2017/01/17 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
浅谈python常用程序算法
2019/03/22 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
python框架django项目部署相关知识详解
2019/11/04 Python
Python celery原理及运行流程解析
2020/06/13 Python
this关键字的作用
2016/01/30 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
家长给老师的道歉信
2014/01/13 职场文书
打架检讨书300字
2014/02/02 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
防汛工作情况汇报
2014/10/28 职场文书
六一儿童节致辞
2015/07/31 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
redis实现排行榜功能
2021/05/24 Redis
Spring整合Mybatis的全过程
2021/06/28 Java/Android
mysql如何配置白名单访问
2021/06/30 MySQL
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
利用js实现简单开关灯代码
2021/11/23 Javascript
ant design vue的form表单取值方法
2022/06/01 Vue.js