class PYCPromise{
static PENDING = 'pending'
static FULFILED = 'fulfiled'
static REJECTED = 'rejected'
constructor(executor){
this.status = PYCPromise.PENDING;
this.value = null;
this.callbacks = [];
try {
executor(this.resolve.bind(this), this.reject.bind(this));
} catch (error) {
this.reject(error);
}
}
resolve(value){
if(this.status == PYCPromise.PENDING){
this.status= PYCPromise.FULFILLED
this.value = value
setTimeout(()=>{
this.callbacks.map(item => {
item.onFulfilled(this.value)
})
})
}
}
reject(value){
if(this.status == PYCPromise.PENDING){
this.status= PYCPromise.FULFILLED
this.value = value
setTimeout(()=>{
this.callbacks.map(item => {
item.onRejected(this.value)
})
})
}
}
then(onFulfilled,onRejected){
if(typeof onFulfilled != 'function'){
onFulfilled = (value)=>value
}
if(typeof onRejected != 'function'){
onRejected = (value)=>{value}
}
let promise = new PYCPromise((resolve,reject)=>{
if(this.status == PYCPromise.PENDING){
this.callbacks.push({
onFulfilled:(value)=>{
this.parse(promise,onFulfilled(value),resolve,reject)
},
onRejected:(value)=>{
this.parse(promise,onRejected(value),resolve,reject)
}
})
}
if(this.status == PYCPromise.FULFILLED){
setTimeout(()=>{
this.parse(promise,onFulfilled(this.value),resolve,reject)
})
}
if(this.status == PYCPromise.REJECTED){
setTimeout(()=>{
this.parse(promise,onRejected(this.value),resolve,reject)
})
}
})
return promise;
}
parse(promise,result,resolve,reject){
if(promise == result){
throw new Error('不能使用同一个promise')
}
try {
if(result instanceof PYCPromise){
result.then(resolve,reject)
}else{
resolve(result)
}
} catch (error) {
reject(error)
}
}
static all(promises){
let values = []
return new PYCPromise((resolve,reject)=>{
promises.forEach(promise => {
promise.then((value)=>{
values.push(value)
if(values.length === promises.length){
resolve(values)
}
},(reason)=>{
reject(reason)
})
});
})
}
static race(promises){
return new PYCPromise((resolve,reject)=>{
promises.map(promise =>{
promise.then((value)=>{
resolve(value)
},reason =>{
reject(reason)
})
})
})
}
static resolve(value){
return new PYCPromise((resolve,reject)=>{
if(value instanceof PYCPromise){
value.then(resolve,reject)
}else{
resolve(value)
}
})
}
static reject(value){
return new PYCPromise((resolve,reject)=>{
reject(value)
})
}
}
new PYCPromise((resolve, reject) => {
resolve("后盾人");
console.log("hdcms.com");
})
.then()
.then(
value => {
console.log(value);
return new PYCPromise((resolve,reject)=>{
resolve('pyc')
});
},
reason => {
console.log(reason);
}
)
.then(
value => {
console.log(value);
},
reason => {
console.log(reason);
}
);
Promise手写源码
最新推荐文章于 2024-07-06 16:47:02 发布