// promise(丑陋的)
class UglyPromise {
constructor(callback){
this.status = 'pending'
this.value = undefined
this.sucessCb = []
this.failedCb = []
const resolve = value => {
if(this.status === 'pending'){
this.status = 'success'
this.value = value
this.sucessCb.forEach(fn => {
fn(value)
})
}
}
const reject = value => {
if(this.status === 'pending'){
this.status = 'failed'
this.value = value
this.failedCb.forEach(fn => {
fn(value)
})
}
}
try {
callback(resolve, reject)
} catch(e) {
reject(e)
}
}
then(successCb, failedCb){
if(typeof successCb === 'function'){
if(this.status == 'pending'){
this.sucessCb.push(successCb)
}else{
successCb(this.value)
}
}
if(typeof failedCb === 'function'){
if(this.status == 'pending'){
this.failedCb.push(failedCb)
}else{
failedCb(this.value)
}
}
return this
}
catch(failedCb){
if(typeof failedCb === 'function'){
if(this.status == 'pending'){
this.failedCb.push(failedCb)
}else{
failedCb(this.value)
}
}
}
}
UglyPromise.resolve = value =>{
return new UglyPromise(rev => {
rev(value)
})
}
UglyPromise.race = arr =>{
return new MyPromise((rev,rej) => {
for(let i = 0;i < arr.length;i++){
arr[i].then(res => {
rev(res)
}).catch(e => {
rej(e)
})
}
})
}
UglyPromise.all = arr =>{
let length = arr.length;
let count = 0;
let result = new Array(length);
if(length == 0){
return UglyPromise.resolve()
}
return new UglyPromise((rev,rej) => {
for(let i = 0;i<arr.length;i++){
arr[i].then(res => {
result[i] = res // 为了结果顺序与开始顺序一致
if(++count == length){
rev(result)
}
}).catch(e => {
rej(e)
})
}
})
}