教你一步步实现一个简易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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
Sep 22 Javascript
文档对象模型DOM通俗讲解
Nov 01 Javascript
AngularJS模块学习之Anchor Scroll
Jan 19 Javascript
vue.js学习之递归组件
Dec 13 Javascript
使用ionic切换页面卡顿的解决方法
Dec 16 Javascript
angularjs ocLazyLoad分步加载js文件实例
Jan 17 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
Jun 06 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
解决option标签selected="selected"属性失效的问题
Nov 06 Javascript
JS开发 富文本编辑器TinyMCE详解
Jul 19 Javascript
原生js+canvas实现验证码
Nov 29 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 多行多列显示
2009/08/15 PHP
php empty函数判断mysql表单是否为空
2010/04/12 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
对联广告js flash激活
2006/10/19 Javascript
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
Vue请求java服务端并返回数据代码实例
2019/11/28 Javascript
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
Python3 replace()函数使用方法
2018/03/19 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
财务总监岗位职责
2014/03/07 职场文书
2014年教务处工作总结
2014/12/03 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers