裝飾器應(yīng)用

前言

在公司采用我的angular后臺方案后,除業(yè)務(wù)代碼外,我就一直在維護(hù)及擴(kuò)展一個增刪改查的可配置組件,很多方法都需要相當(dāng)?shù)撵`活性,如靈活的格式化管道,靈活的排序方法,靈活的驗證器。這里面就涉及了很多的方法公用,特別有時邏輯是一樣的,但需要的返回類型不一樣(Promise\Observabvle)。然后就發(fā)現(xiàn)此時裝飾器有大用處了。

把函數(shù)結(jié)果轉(zhuǎn)換成Observable類型

  • target 是構(gòu)造函數(shù),注意不是實(shí)例
  • key 是方法名
  • descriptor 解析器,value對象就是要裝飾的函數(shù)
import { of, Observable, isObservable } from 'rxjs';

function ResultToObservable(target: any, key: string, descriptor: any) {
  const originalMethod = descriptor.value;
  const newMethod = function(...args: any[]): any {
    const result: any = originalMethod.apply(this, args);
    if (isObservable(result)) {
      return result;
    } else if (result instanceof Promise) {
      return new Observable<any>(ob => {
        result
          .then(_ => {
            ob.next(_);
            ob.complete();
          })
          .catch(e => ob.error(e));
      });
    } else {
      return of(result);
    }
  };
  descriptor.value = newMethod;
}

這樣就可以簡單的共用函數(shù)了

@ResultToObservable
getObservable(){
  return anyFn()
}

如果覺得文章對你有點(diǎn)用的話,麻煩拿出手機(jī),這里有一個你我都有的小福利(每天一次): 打開支付寶首頁搜索“8601304”,即可領(lǐng)紅包。謝謝支持

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容