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 5. 建立一个自执行函数 将上述内容全部包裹进去
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内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! 下载地址: 一定要知道的 25 个 Vue 技巧 详细聊聊vue中组件的props属性 |