国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

手動實現Promise

Lsnsh / 3236人閱讀

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

基本原理

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

import _ from "lodash"

var compose = _.flowRight

class Xpromise {
  constructor(f) {
    this._value = f.bind(undefined, this.resolve, this.reject) // 為傳入的 函數 綁定resolve & reject 方法
    this.chain = undefined // 把then傳入的方法 通過compose 處理成鏈式調用
    this.errFunc = [] // 把catch 傳入的方法
    setTimeout( () => { // 如果new 一個新的對象,傳入的函數不是異步的,則chain & errFunc 拿不到就執行了。所以使用定時器延時執行。
      this.errHandle(this._value)()
    }, 0)
    this.status = "pending" // 設置Xpromise 狀態 主要作用是 確保resolve & reject只能執行其中一個
    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) => {// 為每個傳入的函數包裹 錯誤檢查 代碼
    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
  }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84132.html

相關文章

  • js手動實現promise

    摘要:依次循環直到當前沒有子如何讓異步的在函數中拿到將函數和放入同一個對象對象里面的時候將設置。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果。就算改變已經發生了,你再對對象添加回調函數,也會立即得到這個結果。 let promise = new Promise((resolve111, reject) => { //這里放入我們要執行的函數,可能是同步,也可能是異...

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

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

    AlphaWallet 評論0 收藏0
  • 異步發展流程 —— Generators + co 讓異步更優雅

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

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

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

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

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

    Drinkey 評論0 收藏0

發表評論

0條評論

Lsnsh

|高級講師

TA的文章

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