教你一步步实现一个简易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操作XML实例代码(获取新闻标题并分页,并分页)
May 25 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
Oct 18 Javascript
JS显示下拉列表框内全部元素的方法
Mar 31 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
Apr 06 Javascript
BooStrap对导航条的改造实践小结
Sep 21 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
Jan 21 Javascript
关于在mongoose中填充外键的方法详解
Aug 14 Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 Javascript
vue-iview动态新增和删除的方法
Jun 17 Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 Javascript
javascript实现移动端轮播图
Dec 09 Javascript
吃通javascript正则表达式
Apr 21 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
windows xp下安装pear
2006/12/02 PHP
php 变量定义方法
2009/06/14 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
js转html实体的方法
2016/09/27 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
Form表单上传文件(type="file")的使用
2017/08/03 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Python常见字典内建函数用法示例
2018/05/14 Python
10个Python小技巧你值得拥有
2018/09/29 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
Python 求数组局部最大值的实例
2019/11/26 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
Python request操作步骤及代码实例
2020/04/13 Python
C有"按引用传递"吗
2016/09/06 面试题
出国留学自荐信
2013/10/25 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
心得体会的写法
2014/09/05 职场文书
导游词之凤凰古城
2019/10/22 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
go语言求任意类型切片的长度操作
2021/04/26 Golang
JS Canvas接口和动画效果大全
2021/04/29 Javascript
sql中mod()函数取余数的用法
2021/05/29 SQL Server
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python