教你一步步实现一个简易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 相关文章推荐
js判断为空Null与字符串为空简写方法
Feb 24 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
jQuery多级手风琴菜单实例讲解
Oct 22 Javascript
JavaScript常用本地对象小结
Mar 28 Javascript
第八篇Bootstrap下拉菜单实例代码
Jun 21 Javascript
老生常谈ES6中的类
Jul 31 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
node实现爬虫的几种简易方式
Aug 22 Javascript
如何优雅地取消 JavaScript 异步任务
Mar 22 Javascript
JS错误处理与调试操作实例分析
Apr 13 Javascript
vue element-ui中table合计指定列求和实例
Nov 02 Javascript
javascript前端实现多视频上传
Dec 13 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
PHP常见漏洞攻击分析
2016/02/21 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
javascript数组去掉重复
2011/05/12 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
Python实现的ini文件操作类分享
2014/11/20 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
使用python接入微信聊天机器人
2020/03/31 Python
初学者学习Python好还是Java好
2020/05/26 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
python可以用哪些数据库
2020/06/22 Python
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
反对邪教标语
2014/06/30 职场文书
党员先进事迹材料
2014/12/19 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
基层党支部承诺书
2015/04/30 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android