手写Promise/Promise.all/promise.race
转载自:https://www.bilibili.com/read/cv7483834/
Promise
class Promise1{ state='pending' succeed=null fail=null constructor(fn){ fn (this.resolve.bind(this),this.reject.bind(this)){ } } resolve(result){ setTimeout(()=>{ this.state='fulfilled' this.succeed(result) }) } reject(reason){ setTimeout(()=>{ this.state='rejected' this.fail(reason) }) } then(succed,fail){ this.succed=succeed this.fail=fail } }
promise.all
方法会返回一个Promise实例此实例在iterable参数内所有的promise都完成(resolved)时回调完成(resolve);如果参数中promise有一个失败(rejected),此实例回调失败(reject),失败的原因时第一个失败promise的结果。
Promise1.all=function(arr){ let list=[]; let len=0; hasErr=false; return new Promise1((rrsolve,reject)=>{ for(let i=0;i<arr.length;i++){ arr[i].then(data=>{ list[i]=data len++ len===arr.length&&resolve(list) }.error=>{ !hasErr&&reject(error) hasErr=true }) } }) }
Promise.race
方法返回一个promise实例,一旦迭代器的某个promise完成(resolved)或失败(rejected),返回的promise就会resolve或reject。
Promise1.race=function(arr){ let hasValue=false let hasError=false return new Promise1((rrsolve,reject)=>{ for(let i=0;i<arr.length;i++){ arr[i].then(data=>{ !hasValue&&!hasError&&resolve(data) hasValue=true }.error=>{ !hasValue&&!hasError&&reject(error) hasError=true }) } }) }