欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

利用ES6進(jìn)行Promise封裝的案例-創(chuàng)新互聯(lián)

這篇文章主要介紹了利用ES6進(jìn)行Promise封裝的案例,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

目前成都創(chuàng)新互聯(lián)公司已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、平桂網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

原生Promise解析

簡(jiǎn)介

promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案--回調(diào)函數(shù)和事件--更合理和強(qiáng)大。

promise簡(jiǎn)單說(shuō)就是一個(gè)容器,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,從語(yǔ)法上來(lái)說(shuō),Promise是一個(gè)對(duì)象,從它可以獲取異步操作的消息,Promise提供統(tǒng)一的API,各種異步操作都可以用同樣的方法進(jìn)行處理

特點(diǎn)

對(duì)象的狀態(tài)不受外界影響,Promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài):Pendding、fulfilled、rejected。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),其他操作都無(wú)法改變這個(gè)狀態(tài)。

一旦狀態(tài)改變,就不會(huì)在變,任何時(shí)候都可以得到這個(gè)結(jié)果,只有兩種可能:從Pendding變?yōu)閒ulfilled和從Pendding變?yōu)閞ejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,會(huì)一直保持這個(gè)結(jié)果,這時(shí)就稱為resolved。

利用es6進(jìn)行Promise封裝

處理同步任務(wù)

原生方法調(diào)用方式

  new Promise((resolve,reject)=>{
    resolve(1)
  }).then(res=>{
    console.log(res) //1
  })

同步封裝思考

1.由調(diào)用方式可見(jiàn)Promise是一個(gè)類(lèi)
2.它接收一個(gè)回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)接受resolve和reject方法作為參數(shù)
3.當(dāng)狀態(tài)改變后執(zhí)行then方法,并將resolve或reject的結(jié)果作為then方法接受回調(diào)函數(shù)的參數(shù)

  class Mypromise{
    constructor(callback){
      this.status='pendding'
      //成功結(jié)果
      this.s_res = null
      // 失敗結(jié)果
      this.f_res = null
      callback((arg)=>{ // 使用箭頭函數(shù)this不會(huì)丟失
       // 改變狀態(tài)為成功
       this.status = 'fulfilled'
       this.s_res = arg
      },(arg)=>{
        // 改變狀態(tài)為失敗
        this.status = 'rejected'
        this.f_res = arg 
      })
    }
    then(onresolve,onreject){
      if(this.status === 'fulfilled'){ // 當(dāng)狀態(tài)為成功時(shí)
        onresolve(this.s_res)
      }else if(this.status === 'rejected'){ // 當(dāng)狀態(tài)為失敗時(shí)
        onreject(this.f_res)
      }
    }
  }

處理異步任務(wù)

原生調(diào)用方式

  new Promise((resolve,reject)=>{
    setTimeOut(()=>{
      resolve(1)
    },1000)
  }).then(res=>{
    console.log(res)
  })

異步封裝思考

1.根據(jù)js執(zhí)行機(jī)制,setTimeOut屬于宏任務(wù),then回調(diào)函數(shù)屬于微任務(wù),當(dāng)主線程執(zhí)行完成后,會(huì)從異步隊(duì)列中取出本次的微任務(wù)先執(zhí)行。

2.也就是說(shuō),then方法執(zhí)行時(shí),狀態(tài)還沒(méi)有改變,所有我們需要將then方法執(zhí)行的回調(diào)保存起來(lái),等到異步代碼執(zhí)行完成后,在統(tǒng)一執(zhí)行then方法的回調(diào)函數(shù)

  class Mypromise{
    constructor(callback){
      this.status='pendding'
      //成功結(jié)果
      this.s_res = null
      // 失敗結(jié)果
      this.f_res = null
      this.query = [] // ++ 
      callback((arg)=>{ // 使用箭頭函數(shù)this不會(huì)丟失
       // 改變狀態(tài)為成功
       this.status = 'fulfilled'
       this.s_res = arg
       // 當(dāng)狀態(tài)改變后,統(tǒng)一執(zhí)行then方法的回調(diào)
       this.query.forEach(item=>{
         item.resolve(arg)
       })
      },(arg)=>{
        // 改變狀態(tài)為失敗
        this.status = 'rejected'
        this.f_res = arg 
        // 當(dāng)狀態(tài)改變后,統(tǒng)一執(zhí)行then方法的回調(diào)
       this.query.forEach(item=>{
         item.reject(arg)
       })
      })
    }
    then(onresolve,onreject){
      if(this.status === 'fulfilled'){ // 當(dāng)狀態(tài)為成功時(shí)
        onresolve(this.s_res)
      }else if(this.status === 'rejected'){ // 當(dāng)狀態(tài)為失敗時(shí)
        onreject(this.f_res)
      }else{ // ++ 狀態(tài)沒(méi)有改變
        this.query.push({ // 保存回調(diào)函數(shù)到隊(duì)列中
          resolve:onresolve,
          reject:onreject
        })
      }
    }
  }

處理鏈?zhǔn)秸{(diào)用

原生調(diào)用方式

  new Promise((resolve,reject)=>{
    resolve(1)
  }).then(res=>{
    return res
  }).then(res=>{
    console.log(res)
  })

鏈?zhǔn)秸{(diào)用思考

原生的Promise對(duì)象的then方法,返回的也是一個(gè)Promise對(duì)象,一個(gè)新的Promise才能支持鏈?zhǔn)秸{(diào)用

下一個(gè)then方法可以接受上一個(gè)then方法的返回值作為回調(diào)函數(shù)的參數(shù)

主要考慮上一個(gè)then方法的返回值:

1.Promise對(duì)象/具有then方法的對(duì)象

2.其他值

第一個(gè)then方法返回一個(gè)Promise對(duì)象,它的回調(diào)函數(shù)接受resFn和rejFN兩個(gè)回調(diào)函數(shù)作為參數(shù),把成功狀態(tài)的處理封裝為handle函數(shù),接受成功的結(jié)果作為參數(shù)

在handle函數(shù),根據(jù)onresolve返回值的不同做出不同的處理

  class Mypromise{
    constructor(callback){
      this.status='pendding'
      //成功結(jié)果
      this.s_res = null
      // 失敗結(jié)果
      this.f_res = null
      this.query = [] // ++ 
      callback((arg)=>{ // 使用箭頭函數(shù)this不會(huì)丟失
       // 改變狀態(tài)為成功
       this.status = 'fulfilled'
       this.s_res = arg
       // 當(dāng)狀態(tài)改變后,統(tǒng)一執(zhí)行then方法的回調(diào)
       this.query.forEach(item=>{
         item.resolve(arg)
       })
      },(arg)=>{
        // 改變狀態(tài)為失敗
        this.status = 'rejected'
        this.f_res = arg 
        // 當(dāng)狀態(tài)改變后,統(tǒng)一執(zhí)行then方法的回調(diào)
       this.query.forEach(item=>{
         item.reject(arg)
       })
      })
    }
    then(onresolve,onreject){
      return new Mypromise((resFN,rejFN)=>{
        if(this.status === 'fulfilled'){ // 當(dāng)狀態(tài)為成功時(shí)
          handle(this.s_res)
        }else if(this.status === 'rejected'){ // 當(dāng)狀態(tài)為失敗時(shí)
          errBack(this.f_res)
        }else{ // ++ 狀態(tài)沒(méi)有改變
          this.query.push({ // 保存回調(diào)函數(shù)到隊(duì)列中
            resolve:onresolve,
            reject:onreject
          })
        } 
        function handle(value){
          // 當(dāng)then方法的onresolve方法有返回值時(shí),保存其返回值,沒(méi)有使用其保存的值
          let returnVal = onresolve instanceof Function && onresolve(value) || value
          // 如果onresolve方法返回的是promise對(duì)象,則調(diào)用其then方法
          if(returnVal&&returnVal['then'] instanceof Function){
            returnVal.then(res=>{
              resFN(res)
            },err=>{
              rejFN(err)
            })
          }else{
            resFN(returnVal)
          } 
        }
        function errBack(reason){
          if(onreject instanceof Function){
            let returnVal = reject(reason)
            if(typeof returnVal !== 'undenfined' && returnVal['then'] instanceof Function){
              returnVal.then(res=>{
                resFN(res)
              },err=>{
                rejFN(err)
              })
            }else{
              resFN(returnVal)
            }
          }else{
            rejFN(reason)
          }
        }
      })
    }
  }

Promise.all和Promise.race方法

原生調(diào)用方式

Promise.all方法接受一個(gè)數(shù)組,數(shù)組中的每一項(xiàng)都是一個(gè)Promise實(shí)例,只有數(shù)組中的所有Promise實(shí)例的狀態(tài)都變?yōu)閒ulfilled時(shí),此時(shí)整個(gè)狀態(tài)才會(huì)變成fulfilled,此時(shí)數(shù)組中所有Promise實(shí)例的返回值組成一個(gè)新的數(shù)組,進(jìn)行傳遞。

Promise.race方法和Promise.all方法一樣,如果不是Promise實(shí)例,就會(huì)先調(diào)用Promise.resolve方法,將參數(shù)轉(zhuǎn)為Promise實(shí)例,在進(jìn)行下一步處理。

只要數(shù)組中有一個(gè)參數(shù)的狀態(tài)變?yōu)閒ulfilled就會(huì)進(jìn)行傳遞

// 將現(xiàn)有對(duì)象轉(zhuǎn)換為Promise對(duì)象
  Mypromise.resolve = (arg)=>{
    if(typeof arg == 'undefined' || arg==null){ // 不帶有任何參數(shù)
      return new Mypromise(resolve=>{
        resolve(arg)
      })
    }else if(arg instanceof Mypromise){ // 是一個(gè)Mypromise實(shí)例
      return arg
    }else if(arg['then'] instanceof Function){ // 具有then方法的對(duì)象
      return new Mypromise((resolve,reject)=>{
        arg.then(res=>{
          resolve(res)
        },err=>{
          reject(err)
        })
      })
    }else{ // 參數(shù)不是具有then方法的對(duì)象,或根本不是對(duì)象
      return new Mypromise(resolve=>{
        resolve(arg)
      }) 
    }
  }
  Mypromise.all = (arr)=>{
    if(!Array.isArray(arr)){
      throw new TypeError('參數(shù)必須是一個(gè)數(shù)組')
    }
    return new Mypromise((resolve,reject)=>{
      let i=0,result=[]
      next()
      functon next(){
        // 如果不是Mypromise實(shí)例需要轉(zhuǎn)換
        Mypromise.resolve(arr[i]).then(res=>{
          result.push(res)
          i++
          if(i===arr.length){
            resolve(result)
          }else{
            next()
          }
        },reject)
      }
    })
  }
  Mypromise.race = (arr)=>{
    if(!Array.isArray(arr)){
      throw new TypeError('參數(shù)必須是一個(gè)數(shù)組')
    }
    return new Mypromise((resolve,reject)=>{
      let done = false
      arr.forEach(item=>{
        Mypromise.resolve(item).then(res=>{
          if(!done){
            resolve(res)
            done = true
          }
        },err=>{
          if(!done){
            reject(res)
            done = true
          }
        })
      })
    })
  }

處理Mypromise狀態(tài)確定不能改變的特性

在重寫(xiě)callback中的resolve和reject方法執(zhí)行前,先判斷狀態(tài)是否為'pendding'

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“利用ES6進(jìn)行Promise封裝的案例”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

分享文章:利用ES6進(jìn)行Promise封裝的案例-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)于:http://aaarwkj.com/article10/dddsdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、面包屑導(dǎo)航、軟件開(kāi)發(fā)自適應(yīng)網(wǎng)站、建站公司、網(wǎng)站營(yíng)銷(xiāo)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
91国产视频在线观看免费| 中文字幕韩国三级电影| 亚洲av天堂在线观看| 精品人妻在线中文字幕| 国产精品亚洲欧美日韩在线播放| 日韩高清av一区二区| 久久精品亚洲国产成人av| 91手机精品在线视频| 亚洲欧美中文日韩二区一区| 漂亮人妻少妇中文字幕| 欧美高清成人一区二区三区| 日本福利一区二区三区| 国产麻豆三级在线观看| 精品人妻少妇一区二区三| 持续侵犯人妻中文字幕| 国产夫妻自拍在线视频| 亚洲欧美日韩颜射极品| 亚洲午夜天堂在线a毛片| 国产精品青青草原在线| 中文字幕丰满人妻不满中出片| 亚洲成人自拍在线视频| 欧美国产日本日韩在线黄| 中文字幕在线不卡精品视频| 九九久久亚洲av成人乱片| 二区三区在线欧美日韩| 日本少妇激情后入嗯啊| 最新国产av网址大全| 国产精品又大又黑又长又粗| 成人一区二区三区观看| 日韩不卡区免费在线观看| 一区二区三区日韩欧美在线| 九色国产一区二区三区| 亚洲成人不卡一区二区三区| 日本少妇一区二区99| 国产一区二区乱码在线| 少妇性生活视频免费观看| 日本精品在线一区二区| 亚洲一区二区三区三洲| 少妇高潮一区二区三区在线| 亚洲av毛片一区二区| 亚洲精品高清一区二区|