es6 promise简易实现
直接上代码吧:
function MyPromise(fn) {
// 固定this指向
let _this = this;
// pending, rejected, resolved
_this.status = 'pending';
// 存储promise定义时传入的值
_this.value = '';
// 存储resolve回调函数,主要用于resolve异步执行时存储then中传入的回调函数,非异步直接在then中执行
_this.resolveFnArr = [];
// 存储reject回调函数
_this.rejectFnArr = [];
// pending -> resolved
function resolve (param) {
if (_this.status === 'pending') {
_this.status = 'resolved';
_this.value = param;
// 异步执行resolve时
_this.resolveFnArr.length && _this.resolveFnArr.forEach(f => {
f(_this.value);
});
}
}
// pending -> rejected
function reject (reason) {
if (_this.status === 'pending') {
_this.status = 'rejected';
_this.value = reason;
// 异步执行reject时
_this.rejectFnArr.length && _this.rejectFnArr.forEach(f => {
f(_this.value);
});
}
}
// 执行构造函数并捕获构造异常
try {
fn(resolve,reject);
} catch (e) {
reject(e);
}
}
// 添加then方法
MyPromise.prototype.then = function (resolvedFn, rejectedFn) {
let _this = this;
// 返回promise对象链式调用
let tempPromise = null;
switch (_this.status) {
case 'pending': {
tempPromise = new MyPromise(function (resolve, reject) {
// 在resolve或者reject之前执行then函数,先把回调函数存储起来,状态改变后执行
_this.resolveFnArr.push(function () {
try {
let temp = resolvedFn(_this.value);
resolve(temp);
} catch (error) {
reject(error);
}
});
});
break;
}
case 'resolved': {
tempPromise = new MyPromise(function (resolve, reject) {
try {
let temp = resolvedFn(_this.value);
resolve(temp);
} catch (error) {
reject(error);
}
});
break;
}
case 'rejected': {
tempPromise = new MyPromise(function (resolve, reject) {
try {
let temp = rejectedFn(_this.value);
resolve(temp);
} catch (error) {
reject(error);
}
});
break;
}
default: {}
}
return tempPromise;
}
未完待续。。

浙公网安备 33010602011771号