教你一步步实现一个简易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 相关文章推荐
页面调用单个swf文件,嵌套出多个方法。
Nov 21 Javascript
javascript清空table表格的方法
May 14 Javascript
javascript回到顶部特效
Jul 30 Javascript
javascript中Number的方法小结
Nov 21 Javascript
最好用的Bootstrap fileinput.js文件上传组件
Dec 12 Javascript
javascript实现页面滚屏效果
Jan 17 Javascript
vue-router+nginx 非根路径配置方法
Jun 30 Javascript
微信小程序实现滴滴导航tab切换效果
Jul 24 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
javascript中this的用法实践分析
Jul 29 Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 Javascript
原生js 实现表单验证功能
Feb 08 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循环语句笔记(foreach,list)
2011/11/29 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
js简单时间比较的方法
2016/08/02 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
python实现词法分析器
2019/01/31 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
Python类反射机制使用实例解析
2019/12/30 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
python安装后的目录在哪里
2020/06/21 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
思想品德自我鉴定
2013/10/12 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
金融管理专业求职信
2014/07/10 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
债务追讨律师函
2015/06/24 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android