今天俺尝试一下实现Promise
-
1.下面代码实现不了micro task,所以resolve后,then中回调的函数是立即执行的。
-
2.then方法的作用是加入成功、失败回调函数的入口,以及获取成功value,失败reason的地方
function CustomPromise(execute) {
this.status = 'pending';
this.value = undefined;
this.reason = '';
this.resolveCallback = [];
this.rejectCallback =[];
const ctx = this;
try {
execute(resolve, reject);
} catch (e) {
reject(e)
}
function resolve(value) {
if (ctx.status === 'pending') {
ctx.status = 'fulfilled'
ctx.value = value;
ctx.resolveCallback.forEach(fn => fn(value));
ctx.resolveCallback.length = 0;
}
}
function reject(reason) {
if (ctx.status === 'pending') {
ctx.status = 'rejected';
ctx.reason = reason;
ctx.rejectCallback.forEach(fn => fn(reason))
ctx.rejectCallback.length = 0;
}
}
}
CustomPromise.prototype.then = function (resolveFn, rejectFn) {
if (this.status === 'pending') {
return new CustomPromise((resolve, reject) => {
this.resolveCallback.push((value) => {
const result = resolveFn(value);
if (result instanceof CustomPromise) {
result.then(resolve, reject);
} else {
resolve(result);
}
});
this.rejectCallback.push((reason) => {
const result = resolveFn(reason);
if (result instanceof CustomPromise) {
result.then(resolve, reject);
} else {
reject(result);
}
})
})
}
if (this.status === 'fulfilled') {
return new CustomPromise((resolve, reject) => {
const result = resolveFn(this.value);
if (result instanceof CustomPromise) {
result.then(resolve, reject);
} else {
resolve(result);
}
})
}
if (this.status === 'rejected') {
return new CustomPromise((resolve, reject) => {
const result = rejectFn(this.reason);
if (result instanceof CustomPromise) {
result.then(resolve, reject);
} else {
reject(result);
}
})
}
}
CustomPromise.prototype.catch = function(rejectFn){
return this.then(null,rejectFn);
}
CustomPromise.prototype.finally = function(callback) {
return this.then(
value => CustomPromise.resolve(callback()).then(()=>value)),
reason => CustomPromise.resolve(callback()).then(()=>throw reason))
)
}
CustomPromise.all = function(...args){
return new CustomPromise((resolve,reject)=>{
const result = [];
for(let item of ...args){
item.then(value=>{
result.push(value);
if(result.length === args.length)
resolve(result);
},reason=>{
reject(reason)
})
}
});
}
CustomPromise.race = function(...args){
return new CustomPromise((resolve,reject)=>{
for(let item of ...args){
item.then(value=>{
resolve(result);
},reason=>{
reject(reason)
})
}
})
}
CustomPromise.resolve= function(data){
return new CustomPromise((resolve,reject)=>{
resolve(data);
})
}
CustomPromise.reject= function(data){
return new CustomPromise((resolve,reject)=>{
reject(data);
})
}