前言
在公司采用我的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)紅包。謝謝支持