教你一步步实现一个简易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生成/解析dom的CDATA类型的字段的代码
Apr 22 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
Sep 14 Javascript
js动态添加表格数据使用insertRow和insertCell实现
May 22 Javascript
jQuery Migrate 1.1.0 Released 注意事项
Jun 14 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
浅谈JavaScript的闭包函数
Dec 08 Javascript
jQuery中 bind的用法简单介绍
Feb 13 Javascript
js 性能优化之算法和流程控制
Feb 15 Javascript
微信小程序实现图片懒加载的示例代码
Dec 13 Javascript
详解mpvue开发小程序小总结
Jul 25 Javascript
Vue实现剪贴板复制功能
Dec 31 Javascript
js不常见操作运算符总结
Nov 20 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 STRING 陷阱原理说明
2010/07/24 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
jquery 插件学习(二)
2012/08/06 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Python验证码识别处理实例
2015/12/28 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
python groupby 函数 as_index详解
2019/12/16 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
学前教育毕业生自荐信范文
2013/12/24 职场文书
护理个人求职信范文
2014/01/08 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
项目建议书
2015/02/04 职场文书
法律意见书范文
2015/05/20 职场文书
运动会宣传稿50字
2015/07/23 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
责任书格式
2019/04/18 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书