教你一步步实现一个简易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 相关文章推荐
JQuery 动态扩展对象之另类视角
May 25 Javascript
分享一个自己动手写的jQuery分页插件
Aug 28 Javascript
js动态修改表格行colspan列跨度的方法
Mar 30 Javascript
Javascript简写条件语句(推荐)
Jun 12 Javascript
JS实现添加,替换,删除节点元素的方法
Jun 30 Javascript
vue服务端渲染的实例代码
Aug 28 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
Sep 28 Javascript
AngularJS 实现购物车全选反选功能
Oct 24 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
JS实现的透明度渐变动画效果示例
Apr 28 Javascript
vue实现循环切换动画
Oct 17 Javascript
javascript 函数的暂停和恢复实例详解
Apr 25 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
php Smarty模板生成html文档的方法
2010/04/12 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
详解参数传递四种形式
2015/07/21 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
python检查URL是否正常访问的小技巧
2017/02/25 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
Python如何生成xml文件
2020/06/04 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
求职自荐书范文
2013/12/04 职场文书
采购经理岗位职责
2014/02/16 职场文书
进步之星获奖感言
2014/02/22 职场文书
在人间读书笔记
2015/06/30 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技