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

資訊專(zhuān)欄INFORMATION COLUMN

手寫(xiě)極簡(jiǎn)版Promise

geekidentity / 3062人閱讀

摘要:極簡(jiǎn)版滿(mǎn)足的使用方式生成實(shí)例對(duì)象的方式通過(guò)類(lèi)直接調(diào)用靜態(tài)方法,目前靜態(tài)方法僅支持親測(cè)使用,歡迎指教,互相學(xué)習(xí),鏈接,歡迎。附贈(zèng)利用構(gòu)造函數(shù)手寫(xiě)的方法,鏈接。

極簡(jiǎn)版Promise 滿(mǎn)足的使用方式

生成實(shí)例對(duì)象的方式:new MyPromise()

通過(guò)類(lèi)直接調(diào)用靜態(tài)方法:MyPromise.resolve(),目前靜態(tài)方法僅支持resolve & reject

親測(cè)使用OK,歡迎指教,互相學(xué)習(xí),github鏈接,歡迎star。
附贈(zèng)利用構(gòu)造函數(shù)手寫(xiě)Promise 的方法,github鏈接。

class MyPromise {
  constructor(fn) {
    // 定義Promise 三種狀態(tài)
      this.states = {
          PENDING: "PENDING", RESOLVED: "RESOLVED", REJECTED: "REJECTED"
      }
      // 定義傳遞到then的value
      this.value = null
      // 定義當(dāng)前Promise運(yùn)行狀態(tài)
      this.state = this.states.PENDING
      // 定義Promise失敗狀態(tài)的回調(diào)函數(shù)集合
      this.resolvedCallBacks = []
      // 定義Promise成功狀態(tài)的回調(diào)函數(shù)集合
      this.rejectedCallBacks = []
      // 為靜態(tài)方法定義其內(nèi)部使用的指向?qū)嵗膖hat  
      MyPromise.that = this
      try {
      // 執(zhí)行 new MyPromise() 內(nèi)傳入的方法
          fn(MyPromise.resolve, MyPromise.reject)
      } catch (error) {
          MyPromise.reject(this.value)
      }
  }
    // 靜態(tài)resolve方法,MyPromise實(shí)例不可訪問(wèn);
    //支持類(lèi)MyPromise訪問(wèn),例:MyPromise.resolve("success").then(e=>e)
  static resolve(value) {
      // 由于靜態(tài)方法內(nèi)部的this指向 類(lèi) 而不是 實(shí)例,所以用下面的方法訪問(wèn)實(shí)例對(duì)象
      const that = MyPromise.that
      // 判斷是否是MyPromise實(shí)例訪問(wèn)resolve
      const f = that instanceof MyPromise
      // MyPromise實(shí)例對(duì)象訪問(wèn)resolve
      if (f && that.state == that.states.PENDING) {
          that.state = that.states.RESOLVED
          that.value = value
          that.resolvedCallBacks.map(cb => (that.value = cb(that.value)))
      }
      // MyPromise類(lèi)訪問(wèn)resolve
      if (!f) {
          const obj = new MyPromise()
          return Object.assign(obj, {
              state: obj.states.RESOLVED,
              value
          })
      }
  }
   // 靜態(tài)reject方法,MyPromise實(shí)例不可訪問(wèn);
   //支持類(lèi)MyPromise訪問(wèn),例:MyPromise.reject("fail").then(e=>e)
  static reject(value) {
      const that = MyPromise.that
      const f = that instanceof MyPromise
      if (f && that.state == that.states.PENDING) {
          that.state = that.states.REJECTED
          that.value = value
          that.rejectedCallBacks.map(cb => (that.value = cb(that.value)))
      }
      if (!f) {
          const obj = new MyPromise()
          return Object.assign(obj, {
              state: obj.states.REJECTED,
              value
          })
      }
  }
  // 定義在MyPromise原型上的then方法
  then(onFulfilled, onRejected) {
      const { PENDING, RESOLVED, REJECTED } = this.states
      const f = typeof onFulfilled == "function" ? onFulfilled : c => c;
      const r =
          typeof onRejected == "function"
              ? onRejected
              : c => {
                  throw c;
              };

      switch (this.state) {
          case PENDING:
              // ‘PENDING’狀態(tài)下向回調(diào)函數(shù)集合添加callback
              this.resolvedCallBacks.push(f)
              this.rejectedCallBacks.push(r)
              break;
          case RESOLVED:
              // 將回調(diào)函數(shù)的返回值賦值給 實(shí)例的 value,滿(mǎn)足鏈?zhǔn)秸{(diào)用then方法時(shí)傳遞value
              this.value = f(this.value)
              break;
          case REJECTED:
              // 同上
              this.value = r(this.value)
              break;
          default:
              break;
      }
      // 滿(mǎn)足鏈?zhǔn)秸{(diào)用then,返回MyPromise實(shí)例對(duì)象
      return this
  }
}

MyPromise.resolve("success").then((e) => {
  console.log(e);
  return e + 1
}).then( res=> {
  console.log(res);
})
new MyPromise(resolve => {
  setTimeout(() => {
      resolve(1);
  }, 2000);
})
  .then(res1 => {
      console.log(res1);
      return 2;
  })
  .then(res2 => console.log(res2 ));

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/102820.html

相關(guān)文章

  • 簡(jiǎn)版】SpringBoot+SpringData JPA 管理系統(tǒng)

    摘要:帶你搭一個(gè)的我的目的是做一個(gè)十分簡(jiǎn)易的管理系統(tǒng),這就得有頁(yè)面,下面我繼續(xù)來(lái)講講我是怎么快速搭一個(gè)管理系統(tǒng)的。由于是簡(jiǎn)易版,我的目的是能夠快速搭建,而不在于代碼的規(guī)范性。我們現(xiàn)在希望把記錄塞到一個(gè)管理頁(yè)面上展示起來(lái)。 前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y 在上一篇中已經(jīng)講解了如...

    CntChen 評(píng)論0 收藏0
  • C語(yǔ)言小項(xiàng)目——計(jì)時(shí)器(倒計(jì)時(shí)+報(bào)警提示)

    摘要:大家對(duì)計(jì)時(shí)器應(yīng)該不陌生,我們?cè)谥贫ㄒ粋€(gè)計(jì)劃時(shí),經(jīng)常喜歡設(shè)置一個(gè)倒計(jì)時(shí)來(lái)規(guī)定完成時(shí)限,等到計(jì)時(shí)結(jié)束,它還會(huì)報(bào)警提示,今天,我就用語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)易的倒計(jì)時(shí)計(jì)時(shí)器。 ...

    Lin_YT 評(píng)論0 收藏0
  • Python 送你一棵圣誕樹(shù)

    摘要:但今年不能老送同樣的東西啊,那就給大家送上幾棵圣誕樹(shù)吧。極簡(jiǎn)版這個(gè)可算是最簡(jiǎn)單的圣誕樹(shù)了。例如上面這棵圣誕樹(shù),每一個(gè)樹(shù)枝又是一個(gè)小的圣誕樹(shù)。這與編程中的遞歸思想很像頂部五角星略過(guò)炫彩版一般圣誕樹(shù)上都會(huì)掛上的小彩燈。 今天是圣誕節(jié),先祝大家圣誕快樂(lè)! 有人要說(shuō)了,圣誕節(jié)是耶穌誕生的日子,我又不信基督教,有啥好慶祝的。這你就有所不知了,Python 的誕生也跟圣誕節(jié)有關(guān):1989 年,那是...

    miya 評(píng)論0 收藏0
  • 十幾行代碼教你實(shí)現(xiàn)一個(gè)最簡(jiǎn)版promise

    摘要:最近研究了一下的實(shí)現(xiàn),這篇文章使用了十幾行代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的以便幫助讀者對(duì)有更深的了解。另外一個(gè)有三種狀態(tài)。所以我們有以下的代碼然后我們實(shí)現(xiàn)函數(shù)每次函數(shù)的執(zhí)行會(huì)返回一個(gè)新的。因?yàn)檫@行代碼是異步執(zhí)行的,而當(dāng)中的時(shí),這行代碼不應(yīng)該執(zhí)行。 最近研究了一下promise的實(shí)現(xiàn),這篇文章使用了十幾行代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的promise;以便幫助讀者對(duì)promise有更深的了解。本篇文章實(shí)現(xiàn)的pr...

    SQC 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<