// 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)
})
}
})
}
简单实现Promise
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 我们处理异步的方式,从开始的回调,到Promise,再到现在的async,await,变得越来越方便,直观了。但是...
- Promise的原理 Promise其实内部也有一个defers队列存放事件,.then的事件就在里面,程序开始执...