1. 程式人生 > 實用技巧 >手寫Promise/Promise.all/promise.race

手寫Promise/Promise.all/promise.race

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
                        })
                        
                      }
                 })
              }