教你一步步实现一个简易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 Tips(4) 一些关于提高JQuery性能的Tips
Dec 19 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
读取input:file的路径并显示本地图片的方法
Sep 23 Javascript
jquery验证邮箱格式是否正确实例讲解
Nov 16 Javascript
JavaScript性能优化之小知识总结
Nov 20 Javascript
js表单元素checked、radio被选中的几种方法(详解)
Aug 22 Javascript
基于js实现checkbox批量选中操作
Nov 22 Javascript
Vue 仿百度搜索功能实现代码
Feb 16 Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 Javascript
vue项目配置使用flow类型检查的步骤
Mar 18 Javascript
es6函数之箭头函数用法实例详解
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
phpmyadmin的#1251问题
2006/11/25 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
DOM 基本方法
2009/07/18 Javascript
js的一些常用方法小结
2011/06/29 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
python保存字符串到文件的方法
2015/07/01 Python
python通过socket查询whois的方法
2015/07/18 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
2013年学期结束动员演讲稿
2014/01/07 职场文书
结婚典礼证婚词
2014/01/08 职场文书
小学生自我评价范文
2014/01/25 职场文书
中文专业求职信
2014/06/20 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
毕业酒会致辞
2015/07/29 职场文书
2016寒假假期总结
2015/10/10 职场文书
三年级作文之小小梦想
2019/12/06 职场文书