定义整体结构
/*
自定义 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);
})
}
}