照猫画虎之实现Promise
// 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) }) } }) }