芭比龙

导航

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

 

posted on 2020-09-08 11:00  芭比龙  阅读(476)  评论(0编辑  收藏  举报