定义整体结构
/*自定义 Promise 函数模块:IFFE 立即调用函数模块*/(function (window) { const PENDING = 'pending' const RESOLVED = 'resolved' const REJECTED = 'rejected' /* Promise 构造函数 executor:执行器函数(同步执行) */ function Promise (executor) {} /* Promise 原型对象的 then() 返回一个新的 promise 对象 返回的 promise 的结果由 onResolved/onRejected 执行的结果决定 */ Promise.prototype.then = function (onResolved, onRejected) {} /* Promise 原型对象的 catch() 返回一个新的 promise 对象*/ Promise.prototype.catch = function (onRejected) { return this.then(undefined, onRejected) } /* Promise 函数对象 resolve() */ Promise.resolve = function (value) {} /* Promise 函数对象 reject() */ Promise.reject = function (reason) {} /* Promise 函数对象 all() 返回一个新的 promise 对象,只有当所有promise成功才成功,有一个失败就失败 */ Promise.all = function (promises) {} /* Promise 函数对象 race() race 赛跑 返回一个新的 promise 对象,其结果由第一个完成的promise决定 */ Promise.race = function (promises) {} /* 返回一个 promise 对象,在指定时间后才确定结果 */ Promise.resolveDelay = function (value, time) {} /* 返回一个 promise 对象,在指定时间后才失败 */ Promise.rejectDelay = function (params) {} // 向外暴露 Promise 函数 window.Promise = Promise})(window)
Promise构造函数实现
/* Promise 构造函数 executor:执行器函数(同步执行) */ function Promise (executor) { // 将当前promise的对象存储起来 const self = this self.status = PENDING //状态属性,初始值 pending self.data = undefined// 存储结果数据的属性 self.callbacks = []// 回调函数数组, function resolve (value) { // 如果当前状态不是 pending,直接结果 if (self.status !== PENDING) return // 改变状态 self.status = RESOLVED // 保存value self.data = value // 如果有等待执行的callback函数,立即异步执行回调函数 if (self.callbacks.length > 0) { setTimeout(() => { // 放入回调队列汇总执行所有成功的回调函数 self.callbacks.forEach(callback => { callback.onResolved(value) }) }); } } function reject (reason) { // 如果当前状态不是 pending,直接结果 if (self.status !== PENDING) return // 改变状态 self.status = REJECTED // 保存value self.data = reason // 如果有等待执行的callback函数,立即异步执行回调函数 if (self.callbacks.length > 0) { setTimeout(() => { // 放入回调队列汇总执行所有成功的回调函数 self.callbacks.forEach(callback => { callback.onRejected(reason) }) }); } } /* 传入一个执行器函数,立即执行*/ try { executor(resolve, reject) } catch (error) { reject(error) } }
Promise.then()/catch()的实现
/* Promise 原型对象的 then() 返回一个新的 promise 对象 返回的 promise 的结果由 onResolved/onRejected 执行的结果决定 */ Promise.prototype.then = function (onResolved, onRejected) { // 因为没有 this 导致 this 指向错误,所以在定义 prototype 方法上一定记得不要使用箭头函数 const self = this // 向后传递成功的 value onResolved = typeof onResolved === 'function' ? onResolved : value => value // 指定默认的失败回调,实现错误/异常穿透的关键点,向后传递失败的 reason onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason } return new Promise((resolve, reject) => { const handle = (callback) => { /* 1. 抛出异常 2. 返回 promise ,返回 promise 的结果就是当前执行回调函数的结果 3. 返回不是 promise ,返回 promise 成功,value 为返回值 */ try { const result = callback(self.data) if (result instanceof Promise) { result.then(resolve, reject) } else { resolve(result) } } catch (error) { reject(error) } } // 当前 promise(then) 的状态时 resolved if (self.status === RESOLVED) { // 异步执行回调函数 setTimeout(() => { handle(onResolved) }); } // 当前 promise(then) 的状态时 rejected if (self.status === REJECTED) { // 异步执行回调函数 setTimeout(() => { handle(onRejected) }); } // 当前 promise(then) 的状态时 pending if (self.status === PENDING) { // 将成功或失败的回调函数保存在 callbacks 数组中 self.callbacks.push({ onResolved: () => { handle(onResolved) }, onRejected: () => { handle(onRejected) } }) } }) } /* Promise 原型对象的 catch() 返回一个新的 promise 对象*/ Promise.prototype.catch = function (onRejected) { return this.then(undefined, onRejected) }
Promise.resolve()/reject()的实现
/* Promise 函数对象 resolve() */ Promise.resolve = function (value) { // 返回一个 promise return new Promise((resolve, reject) => { /* 判断 value 情况 1. value === promise 2. value != promise */ if (value instanceof Promise) { // 根据 value 结果,作为当前 promise 的结果 value.then(resolve, reject) } else { // promsie => 成功,数据是 value resolve(value) } }) } /* Promise 函数对象 reject() */ Promise.reject = function (reason) { // 返回一个失败的 promise return new Promise((resolve, reject) => { reject(reason) }) }
Promise.all()/race()的实现
/* Promise 函数对象 all() 返回一个新的 promise 对象,只有当所有promise成功才成功,有一个失败就失败 */ Promise.all = function (promises) { // 保存所有成功 value 的数组 // const values = [] const values = new Array(promises.length) // 计数器,保存成功 promise 的数量 let resolvedCount = 0 return new Promise((resolve, reject) => { // 遍历获取每个 promise 的结果 promises.forEach((p, index) => { // Promise.resolve(p) 处理数组不是 promise 对象的情况 Promise.resolve(p).then( value => { resolvedCount++ // p 成功,将成功的 value 保存在 values values[index] = value // 如果全部成功,将 return 的 promise 改变成功 if (resolvedCount === promises.length) { resolve(values) } }, reason => { reject(reason) }) }) }) } /* Promise 函数对象 race() race 赛跑 返回一个新的 promise 对象,其结果由第一个完成的promise决定 */ Promise.race = function (promises) { return new Promise((resolve, reject) => { // 遍历获取每个 promise 的结果 promises.forEach((p, index) => { Promise.resolve(p).then( value => { // 一旦有成功就该改变状态,将 return 变为成功 resolve(value) }, reason => { // 一旦有失败就该改变状态,将 return 变为失败 reject(reason) }) }) }) }
Promise.resolveDelay()/rejectDelay()的实现(自定义添加)
/* 返回一个 promise 对象,在指定时间后才确定结果 */ Promise.resolveDelay = function (value, time) { // 返回一个 promise return new Promise((resolve, reject) => { setTimeout(() => { /* 判断 value 情况 1. value === promise 2. value != promise */ if (value instanceof Promise) { // 根据 value 结果,作为当前 promise 的结果 value.then(resolve, reject) } else { // promsie => 成功,数据是 value resolve(value) } }, time); }) } /* 返回一个 promise 对象,在指定时间后才失败 */ Promise.rejectDelay = function (params) { // 返回一个失败的 promise return new Promise((resolve, reject) => { setTimeout(() => { reject(reason) }, time); }) }
class 版本
const PENDING = 'pending'const RESOLVED = 'resolved'const REJECTED = 'rejected'class Promise { /* Promise 构造构造器 executor:执行器函数(同步执行) */ constructor(executor) { // 将当前promise的对象存储起来 const self = this self.status = PENDING //状态属性,初始值 pending self.data = undefined// 存储结果数据的属性 self.callbacks = []// 回调函数数组, function resolve (value) { // 如果当前状态不是 pending,直接结果 if (self.status !== PENDING) return // 改变状态 self.status = RESOLVED // 保存value self.data = value // 如果有等待执行的callback函数,立即异步执行回调函数 if (self.callbacks.length > 0) { setTimeout(() => { // 放入回调队列汇总执行所有成功的回调函数 self.callbacks.forEach(callback => { callback.onResolved(value) }) }); } } function reject (reason) { // 如果当前状态不是 pending,直接结果 if (self.status !== PENDING) return // 改变状态 self.status = REJECTED // 保存value self.data = reason // 如果有等待执行的callback函数,立即异步执行回调函数 if (self.callbacks.length > 0) { setTimeout(() => { // 放入回调队列汇总执行所有成功的回调函数 self.callbacks.forEach(callback => { callback.onRejected(reason) }) }); } } /* 传入一个执行器函数,立即执行*/ try { executor(resolve, reject) } catch (error) { reject(error) } } /* Promise 原型对象的 then()返回一个新的 promise 对象返回的 promise 的结果由 onResolved/onRejected 执行的结果决定 */ then (onResolved, onRejected) { // 因为没有 this 导致 this 指向错误,所以在定义 prototype 方法上一定记得不要使用箭头函数 const self = this // 向后传递成功的 value onResolved = typeof onResolved === 'function' ? onResolved : value => value // 指定默认的失败回调,实现错误/异常穿透的关键点,向后传递失败的 reason onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason } return new Promise((resolve, reject) => { const handle = (callback) => { /* 1. 抛出异常 2. 返回 promise ,返回 promise 的结果就是当前执行回调函数的结果 3. 返回不是 promise ,返回 promise 成功,value 为返回值 */ try { const result = callback(self.data) if (result instanceof Promise) { result.then(resolve, reject) } else { resolve(result) } } catch (error) { reject(error) } } // 当前 promise(then) 的状态时 resolved if (self.status === RESOLVED) { // 异步执行回调函数 setTimeout(() => { handle(onResolved) }); } // 当前 promise(then) 的状态时 rejected if (self.status === REJECTED) { // 异步执行回调函数 setTimeout(() => { handle(onRejected) }); } // 当前 promise(then) 的状态时 pending if (self.status === PENDING) { // 将成功或失败的回调函数保存在 callbacks 数组中 self.callbacks.push({ onResolved: () => { handle(onResolved) }, onRejected: () => { handle(onRejected) } }) } }) } /* Promise 原型对象的 catch() 返回一个新的 promise 对象*/ catch (onRejected) { return this.then(undefined, onRejected) } /* Promise 函数对象 resolve() static 定义 class 的静态方法 不能再累的实例上调用静态方法,而应该通过类本身调用 */ static resolve = function (value) { // 返回一个 promise return new Promise((resolve, reject) => { /* 判断 value 情况 1. value === promise 2. value != promise */ if (value instanceof Promise) { // 根据 value 结果,作为当前 promise 的结果 value.then(resolve, reject) } else { // promsie => 成功,数据是 value resolve(value) } }) } /* Promise 函数对象 reject() */ static reject = function (reason) { // 返回一个失败的 promise return new Promise((resolve, reject) => { reject(reason) }) } /* Promise 函数对象 all() 返回一个新的 promise 对象,只有当所有promise成功才成功,有一个失败就失败 */ static all = function (promises) { // 保存所有成功 value 的数组 // const values = [] const values = new Array(promises.length) // 计数器,保存成功 promise 的数量 let resolvedCount = 0 return new Promise((resolve, reject) => { // 遍历获取每个 promise 的结果 promises.forEach((p, index) => { // Promise.resolve(p) 处理数组不是 promise 对象的情况 Promise.resolve(p).then( value => { resolvedCount++ // p 成功,将成功的 value 保存在 values values[index] = value // 如果全部成功,将 return 的 promise 改变成功 if (resolvedCount === promises.length) { resolve(values) } }, reason => { reject(reason) }) }) }) } /* Promise 函数对象 race() race 赛跑 返回一个新的 promise 对象,其结果由第一个完成的promise决定 */ static race = function (promises) { return new Promise((resolve, reject) => { // 遍历获取每个 promise 的结果 promises.forEach((p, index) => { Promise.resolve(p).then( value => { // 一旦有成功就该改变状态,将 return 变为成功 resolve(value) }, reason => { // 一旦有失败就该改变状态,将 return 变为失败 reject(reason) }) }) }) } /* 返回一个 promise 对象,在指定时间后才确定结果 */ static resolveDelay = function (value, time) { // 返回一个 promise return new Promise((resolve, reject) => { setTimeout(() => { /* 判断 value 情况 1. value === promise 2. value != promise */ if (value instanceof Promise) { // 根据 value 结果,作为当前 promise 的结果 value.then(resolve, reject) } else { // promsie => 成功,数据是 value resolve(value) } }, time); }) } /* 返回一个 promise 对象,在指定时间后才失败*/ static rejectDelay = function (params) { // 返回一个失败的 promise return new Promise((resolve, reject) => { setTimeout(() => { reject(reason) }, time); }) }}