手寫Promise/Promise.all/promise.race
阿新 • • 發佈:2020-09-08
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 }) } }) }