教你一步步实现一个简易promise

 更新时间:2021年11月02日 11:48:07   作者:IT棉被  
Promise是异步编程的一种解决方案,比传统的解决方案回调函数和事件更合理且更强大,这篇文章主要给大家介绍了关于如何一步步实现一个简易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                        

是不是很简单呀,快叫上身边的小伙伴一起来试一试吧!

总结

到此这篇关于实现一个简易promise的文章就介绍到这了,更多相关实现简易promise内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js压缩工具 yuicompressor 使用教程

    js压缩工具 yuicompressor 使用教程

    yuicompressor使用纯Java编写,运行需要JDK1.4或更高版本,基于Rhino 对JavaScript源文件进行分析和切词。
    2010-03-03
  • JS实现鼠标滑过折叠与展开菜单效果代码

    JS实现鼠标滑过折叠与展开菜单效果代码

    这篇文章主要介绍了JS实现鼠标滑过折叠与展开菜单效果代码,涉及JavaScript基于鼠标事件动态改变页面元素样式的相关实现技巧,非常具有实用价值,需要的朋友可以参考下
    2015-09-09
  • 使用Three.js 实现虎年春节3D创意页面

    使用Three.js 实现虎年春节3D创意页面

    虎年春节将至,本文使用 React + Three.js技术栈,实现趣味 3D创意页面,主要包括:ShadowMaterial、 MeshPhongMaterial等基本材质的使用、使用 LoadingManager展示模型加载进度、OrbitControls`的缓动动画、TWEEN简单补间动画效果等,感兴趣的朋友一起看看吧
    2022-01-01
  • JS 对象属性相关(检查属性、枚举属性等)

    JS 对象属性相关(检查属性、枚举属性等)

    这篇文章主要介绍了JS 对象属性相关(检查属性、枚举属性等),需要的朋友可以参考下
    2015-04-04
  • JavaScript实现拖拽排序的方法详解

    JavaScript实现拖拽排序的方法详解

    可拖拽排序的菜单效果大家想必都很熟悉,本次我们通过一个可拖拽排序的九宫格案例来演示其实现原理,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05
  • 一问了解JavaScript中的元数据

    一问了解JavaScript中的元数据

    本文主要介绍了一问了解JavaScript中的元数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 一次让你了解全部JavaScript的作用域

    一次让你了解全部JavaScript的作用域

    这篇文章主要介绍了一次让你了解全部JavaScript的作用域,作用域决定了变量的生命周期和可见性,变量在作用域范围之外是不可见的。,需要的朋友可以参考下
    2019-06-06
  • ie与firefox下的event使用说明与详细区别

    ie与firefox下的event使用说明与详细区别

    event是ie自带的一个对象,而ff中不存在该对象,只能通过传递参数(并且惟一)的方式来实现event.
    2009-10-10
  • JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解

    JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解

    这篇文章主要介绍了JavaScript实现的原生态兼容IE6可调可控滚动文字功能,简单说明了文字滚动的实现原理并结合具体实例形式给出了javascript文字滚动功能的具体实现代码,需要的朋友可以参考下
    2017-09-09
  • layui prompt 设置允许空白提交的方法

    layui prompt 设置允许空白提交的方法

    今天小编就为大家分享一篇layui prompt 设置允许空白提交的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09

最新评论