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

資訊專欄INFORMATION COLUMN

es6裝飾器異步使用

時飛 / 2192人閱讀

摘要:裝飾器的寫法是在類或類屬性之前,加個方法名。使用場景突然想到用裝飾器,當(dāng)然是有業(yè)務(wù)需要。但初始化代碼又不歸我控制,且是異步接口請求,不能立即執(zhí)行,這就導(dǎo)致每個函數(shù)都要調(diào)用一遍這個方法。

裝飾器簡介

個人理解,某些場景需要在不改變原有類和屬性的基礎(chǔ)上擴(kuò)展一些功能,所以裝飾器就出現(xiàn)了。

裝飾器的寫法是在類或類屬性之前,加個方法名。學(xué)過java的同學(xué)應(yīng)該比較熟悉這種寫法,Spring中鋪天蓋地都是注解。具體細(xì)節(jié)到處都是,就不贅述了。

不過截止到今天(2019年8月),遺憾的是nodejs還未原生支持,仍然需要babel編譯。

使用場景

突然想到用裝飾器,當(dāng)然是有業(yè)務(wù)需要。寫了一個api類,所有暴露的函數(shù)都需要進(jìn)行一步初始化操作。但初始化代碼又不歸我控制,且是異步接口請求,不能立即執(zhí)行,這就導(dǎo)致每個函數(shù)都要調(diào)用一遍這個init方法。因?yàn)榧恿司彺妫總€都要判斷有沒有緩存,比較惡心。

常用例子

一般用這個日志模塊來舉例,不過它是同步的

class Math {
  @log
  add(a, b) {
    return a + b;
  }
}

function log(target, name, descriptor) {
  var oldValue = descriptor.value;

  descriptor.value = function() {
    console.log(`Calling "${name}" with`, arguments);
    return oldValue.apply(null, arguments);
  };

  return descriptor;
}

const math = new Math();

// passed parameters should get logged now
math.add(2, 4);
修改為異步
let init = 0;
class Maths {
  @log
  add (a, b) {
    return a + b + init;
  }
}

function log (target, name, descriptor) {
  let oldValue = descriptor.value;
  descriptor.value = function (...args) { //有時候,arguments指向不對,可能是babel的鍋?
    console.log(`Calling "${name}" with`, args);
    return new Promise((resolve) => {
      setTimeout(function () {
        // args = [...args, 100];
        init = 100;
        resolve(oldValue.apply(target, args)); //this指向
      }, 100);
    });
  };
  return descriptor;
}

const math = new Maths();

(async () => {
  let a = await math.add(2, 4);
  console.log(a);
})();

在具體函數(shù)前加了裝飾器后,會先執(zhí)行log方法,這樣緩存的變量就修改了。雖然結(jié)果變成異步的,但也滿足我的需要了。

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

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

相關(guān)文章

  • 新上課程推薦:TypeScript完全解讀(總26課時)

    摘要:本套課程包含兩大部分,第一部分是基礎(chǔ)部分,也是重要部分,參考官方文檔結(jié)構(gòu),針對內(nèi)容之間的關(guān)聯(lián)性和前后順序進(jìn)行合理調(diào)整。 showImg(https://segmentfault.com/img/bVbpBA0?w=1460&h=400); 講師簡介: iview 核心開發(fā)者,iview-admin 作者,百萬級虛擬渲染表格組件 vue-bigdata-table 作者。目前就職于知名互...

    caozhijian 評論0 收藏0
  • ES6 系列之我們來聊聊裝飾

    摘要:第二部分源碼解析接下是應(yīng)用多個第二部分對于一個方法應(yīng)用了多個,比如會編譯為在第二部分的源碼中,執(zhí)行了和操作,由此我們也可以發(fā)現(xiàn),如果同一個方法有多個裝飾器,會由內(nèi)向外執(zhí)行。有了裝飾器,就可以改寫上面的代碼。 Decorator 裝飾器主要用于: 裝飾類 裝飾方法或?qū)傩? 裝飾類 @annotation class MyClass { } function annotation(ta...

    eternalshallow 評論0 收藏0
  • JS 裝飾,一篇就夠

    摘要:的裝飾器中的同樣借鑒了這個語法糖,不過依賴于的方法。等同于也就是說,裝飾器是一個對類進(jìn)行處理的函數(shù)。別名或裝飾器在控制臺顯示一條警告,表示該方法將廢除。有了裝飾器,就可以改寫上面的代碼。 更多文章,請在Github blog查看 在 ES6 中增加了對類對象的相關(guān)定義和操作(比如 class 和 extends ),這就使得我們在多個不同類之間共享或者擴(kuò)展一些方法或者行為的時候,變得并...

    learning 評論0 收藏0
  • ES6重新認(rèn)識JavaScript設(shè)計模式: 裝飾模式

    摘要:什么是裝飾器模式向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)的設(shè)計模式被稱為裝飾器模式,它是作為現(xiàn)有的類的一個包裝。中的裝飾器模式中有一個的提案,使用一個以開頭的函數(shù)對中的及其屬性方法進(jìn)行修飾。 1 什么是裝飾器模式 showImg(https://segmentfault.com/img/remote/1460000015970102?w=1127&h=563); 向一個現(xiàn)有的對...

    wendux 評論0 收藏0

發(fā)表評論

0條評論

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