成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

手動實現(xiàn)Promise

Lsnsh / 3243人閱讀

摘要:基本原理今天心血來潮,哈哈,就想寫個對象,需要說的是,我沒有參考誰的代碼,也沒有去看的源碼,當(dāng)然,我實現(xiàn)的是一個乞丐版的,只有的功能,其中只能抓取一次。設(shè)置狀態(tài)主要作用是確保只能執(zhí)行其中一個為每個傳入的函數(shù)包裹錯誤檢查代碼

基本原理

今天心血來潮,哈哈,就想寫個promise對象,需要說的是,我沒有參考誰的代碼,也沒有去看promise的源碼,當(dāng)然,我實現(xiàn)的是一個乞丐版的promise,只有then & catch 的功能,其中catch只能抓取一次。僅供大伙閑暇看看,打發(fā)下時間。代碼注釋簡單說了下,如下:

import _ from "lodash"

var compose = _.flowRight

class Xpromise {
  constructor(f) {
    this._value = f.bind(undefined, this.resolve, this.reject) // 為傳入的 函數(shù) 綁定resolve & reject 方法
    this.chain = undefined // 把then傳入的方法 通過compose 處理成鏈?zhǔn)秸{(diào)用
    this.errFunc = [] // 把catch 傳入的方法
    setTimeout( () => { // 如果new 一個新的對象,傳入的函數(shù)不是異步的,則chain & errFunc 拿不到就執(zhí)行了。所以使用定時器延時執(zhí)行。
      this.errHandle(this._value)()
    }, 0)
    this.status = "pending" // 設(shè)置Xpromise 狀態(tài) 主要作用是 確保resolve & reject只能執(zhí)行其中一個
    return this
  }
  resolve = (data) => {
    if(this.status == "pending")
      this.status = "resolved"
    this.status == "resolved" && this.chain && this.chain(data)
  }
  reject = (data) => {
    if(this.status == "pending")
      this.status = "rejected"

    this.status = "rejected" && this.errFunc[0](data)
  }
  then = (f) => {
    this.chain = this.chain? compose(this.errHandle(f), this.chain): this.errHandle(f)
    return this
  }
  errHandle = (f) => {// 為每個傳入的函數(shù)包裹 錯誤檢查 代碼
    return function() {
      var args = Array.prototype.slice.call(arguments, 0)
      try{
        return f.apply(f,args)
      }catch(e){
        if(this.errFunc.length !== 0)
          this.errFunc[0](e)
        else
          throw new Error(e)

        return
      }
    }
  }
  catch = (f) => {
    this.errFunc.push(f)
    return this
  }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84132.html

相關(guān)文章

  • js手動實現(xiàn)promise

    摘要:依次循環(huán)直到當(dāng)前沒有子如何讓異步的在函數(shù)中拿到將函數(shù)和放入同一個對象對象里面的時候?qū)⒃O(shè)置。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結(jié)果。就算改變已經(jīng)發(fā)生了,你再對對象添加回調(diào)函數(shù),也會立即得到這個結(jié)果。 let promise = new Promise((resolve111, reject) => { //這里放入我們要執(zhí)行的函數(shù),可能是同步,也可能是異...

    VPointer 評論0 收藏0
  • 深入理解Webpack核心模塊Tapable鉤子[異步版]

    摘要:接上一篇文章深入理解核心模塊鉤子同步版中三個注冊方法同步注冊的是中對三個觸發(fā)方法這一章節(jié)我們將分別實現(xiàn)異步的版本和版本異步鉤子的版本的版本的版本異步的鉤子分為并行和串行的鉤子,并行是指等待所有并發(fā)的異步事件執(zhí)行之后再執(zhí)行最終的異步回調(diào)。 接上一篇文章 深入理解Webpack核心模塊WTApable鉤子(同步版) tapable中三個注冊方法 1 tap(同步) 2 tapAsync(...

    AlphaWallet 評論0 收藏0
  • 異步發(fā)展流程 —— Generators + co 讓異步更優(yōu)雅

    摘要:遍歷器原有的表示集合的數(shù)據(jù)結(jié)構(gòu),主要有和,在中又加入了和,這樣就有了四種數(shù)據(jù)集合,還可以組合使用它們,如數(shù)組的成員是或,這樣就需要一種統(tǒng)一的接口機制,用來處理所有不同的數(shù)據(jù)結(jié)構(gòu)。 showImg(https://segmentfault.com/img/remote/1460000018998438?w=900&h=431); 閱讀原文 Generators 簡介 Generato...

    dingda 評論0 收藏0
  • fetch使用的常見問題及其解決辦法

    首先聲明一下,本文不是要講解fetch的具體用法,不清楚的可以參考MDN fetch教程。 引言 說道fetch就不得不提XMLHttpRequest了,XHR在發(fā)送web請求時需要開發(fā)者配置相關(guān)請求信息和成功后的回調(diào),盡管開發(fā)者只關(guān)心請求成功后的業(yè)務(wù)處理,但是也要配置其他繁瑣內(nèi)容,導(dǎo)致配置和調(diào)用比較混亂,也不符合關(guān)注分離的原則;fetch的出現(xiàn)正是為了解決XHR存在的這些問題。例如下面代碼: f...

    pubdreamcc 評論0 收藏0
  • 深入探析koa之異步回調(diào)處理篇

    摘要:而之后,我們得到的是一個是一個對象,我們可以使用語句定義回調(diào)函數(shù),函數(shù)的內(nèi)容呢,則是將讀取到的返回給并繼續(xù)讓從斷點處執(zhí)行。 在上一篇中我們梳理了koa當(dāng)中中間件的洋蔥模型執(zhí)行原理,并實現(xiàn)了一個可以讓洋蔥模型自動跑起來的流程管理函數(shù)。這一篇,我們再來研究一下koa當(dāng)中異步回調(diào)同步化寫法的原理,同樣的,我們也會實現(xiàn)一個管理函數(shù),是的我們能夠通過同步化的寫法來寫異步回調(diào)函數(shù)。 1. 回調(diào)金字...

    Drinkey 評論0 收藏0

發(fā)表評論

0條評論

Lsnsh

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<