教你一步步实现一个简易promise
作者:IT棉被 发布时间:2024-04-26 17:11:37
目录
step1 搭建框架
step2 填充搭建好了的Promise框架
总结
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
是不是很简单呀,快叫上身边的小伙伴一起来试一试吧!
来源:https://juejin.cn/post/7025623396742332430


猜你喜欢
- 前言python学习之路任重而道远,要想学完说容易也容易,说难也难。很多人说python最好学了,但扪心自问,你会用python做什么了?刚
- 字符串函数查看字符的ascii码值ascii(str),str是空串时返回0select ascii('a');
- 本文实例总结了Python操作redis方法。分享给大家供大家参考,具体如下:python连接方式可参考:https://www.jb51.
- 一、ZeroClipboard下载地址为大家提供细一些ZeroClipboard的下载地址:Zero Clipboard 开源的 JavaS
- 本博客演示使用OpenCV和PIL读取和显示图像的差异。首先来看一下原始的bgr图像 src.jpg1. 使用cv2读取src.jpg并转为
- Python 数据库编程,ODBC方式实现通讯录,供大家参考,具体内容如下#-*-coding:utf-8-*-import pyodbci
- Vue按回车键进行搜索需求:为了用户方便进行搜索数据的时候不想点击搜索按钮,想要在input输入框内输入完成之后直接按回车键进行搜索第一种方
- 本文实例为大家分享了python实现简单学生管理系统的具体代码,供大家参考,具体内容如下学生管理系统相信大家学各种语言的时候,练习总是会写各
- Python 2里面读取输入的函数是raw_input(), Python 3的是input(),读入一个值后回车读取输入就退出了,想要一次
- drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure()
- 设计思路本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享。框架采用python3 + selenium3 + PO + ya
- 源码:#路飞骷髅import turtle as t#黄底帽子t.pu()t.goto(0,200)t.circle(-130,-80)t.
- 本文实例讲述了Python实现的计算器功能。分享给大家供大家参考,具体如下:源码:# -*- coding:utf-8 -*-#! pyth
- 本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法!Dja
- 在我们武汉的一个项目中,用户提供的数据库服务器有16G左右的内存,但我们只能使用8G多的内存,为了提高内存的得用率,特意参考了一些资料,得出
- 前言1992年扫雷被加入到windows3.1,成为早期windows的经典游戏。近来接触python的GUI(图形化)编程,于是通过编写扫
- 使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?在JDBC编程接口中State
- MYSQL有不同类型的日志文件(各自存储了不同类型的日志),从它们当中可以查询到MYSQL里都做了些什么,对于MYSQL的管理工作,这些日志
- 中间那个控制块,其实也是一个iframe,把他的宽度定义为10。 然后在他的内部js,控制 左右2个iframe. functio
- psutil是一个跨平台的Python库,它允许你获取有关系统进程和系统资源使用情况的信息。它支持Windows、Linux、OS X、Fr