/**
* Promise构造函数
* excutor:执行器函数(同步执行)
* @param excutor
*/
function Promise(executor) {
const _this = this;
_this.status = "pending"; // 给Promise对象指定status属性,初始值为pending
_this.data = undefined; // 给Promise对象指定一个用于存储结果数据的属性
_this.callbacks = []; // 每个元素的结构:{onResolve(){},onReject(){}}
function resolve(value) {
// 如果状态已经修改,返回
if (_this.status !== "pending") return;
// 修改状态为fullFilled
_this.status = "fullFilled";
// 保存value数据
_this.data = value;
if (_this.callbacks.length > 0) {
setTimeout(function () {
// 放入队列中执行所有成功的回调
_this.callbacks.forEach(callbackObj => {
callbackObj.onResolved(value)
})
})
}
}
function reject(reason) {
// 如果状态已经修改,返回
if (_this.status !== "pending") return;
// 修改状态为fullFilled
_this.status = "rejected";
// 保存value数据
_this.data = reason;
if (_this.callbacks.length > 0) {
setTimeout(function () {
// 放入队列中执行所有成功的回调
_this.callbacks.forEach(callbackObj => {
callbackObj.onRejected(reason)
})
})
}
}
// 立即同步执行excutor
try {
executor(resolve, reject)
} catch (reason) {
// 如果执行器抛出异常,Promise对象变为rejected状态
reject(reason)
}
}
/**
* Promise原型对象的then(),指定成功和失败的回调函数,返回一个新的Promise对象
* @param onResolved
* @param onRejected
*/
Promise.prototype.then = function (onResolved, onRejected) {
onResolved = typeof onResolved === 'function' ? onResolved : value => value; // 向后传递成功的value
// 指定默认的失败回调(实现错误/异常传递的关键点)
onRejected = typeof onRejected === 'function' ? onRejected : reason => {
throw reason
} // 向后传递失败的reason
const _this = this;
/**
调用指定回调函数执行
*/
return new Promise((resolve, reject) => {
function handler(callback) {
/**
1. 如果抛出异常,return的Promise就会失败,reason就是error
2. 如果回调函数返回的不是Promise,return的Promise就会成功,value就是返回的值
3. 如果回调函数返回的是Promise,return的Promise结果就是这个Promise的结果
*/
try {
const result = callback(_this.data);
if (result instanceof Promise) {
result.then(
value => resolve(value), // 当result成功时,让return的Promise也成功
reason => reject(reason
手写Promise
最新推荐文章于 2022-09-25 22:53:29 发布