// 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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 前几天看一本书,叫做《Neural Network and Deep Learning》. 这本书中介绍了神经网络...
- 我们处理异步的方式,从开始的回调,到Promise,再到现在的async,await,变得越来越方便,直观了。但是...
- Promise的原理 Promise其实内部也有一个defers队列存放事件,.then的事件就在里面,程序开始执...