教你一步步实现一个简易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 相关文章推荐
json对象转字符串如何实现
Dec 02 Javascript
js和jquery中循环的退出和继续下一个循环
Sep 03 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
Jan 12 Javascript
基于原生js淡入淡出函数封装(兼容IE)
Oct 20 Javascript
vue数据双向绑定原理解析(get & set)
Mar 08 Javascript
基于js中style.width与offsetWidth的区别(详解)
Nov 12 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
Dec 19 Javascript
JS加密插件CryptoJS实现AES加密操作示例
Aug 16 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
puppeteer库入门初探
Jan 09 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 Vue.js
一定要知道的 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中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
JS实现倒计时图文效果
2018/11/17 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
安全教育心得体会
2013/12/29 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
活动总结的格式
2014/05/07 职场文书
北京申奥口号
2014/06/19 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
2015年春节标语口号
2014/12/09 职场文书