做爲前端小白,在進入第一個公司後的項目用的框架就是三大框架中最難的angular4,在折騰完angular的語法和typeScript後開始寫一些業務代碼,發現angular的項目中有大量RxJS的內容,在異步請求,狀態管理,服務管理等等方面都有應用。而這個東西又實在折騰人,官方文檔上面寫的晦澀又抽象,網上的中文資料也不多,還有不少是老版本的東西,看的一臉懵逼。前端
在踩了許多坑以後決定將本身的學習過程用博客記錄下來,但願能夠加深記憶,也但願能對新學RxJS的人有些許幫助編程
文章參考了不少網上的資料及自身的學習過程segmentfault
RxJS中文文檔api
it邦鐵人賽,JerryHong大佬的30天精通RxJS系列(強烈推薦)bash
RxJS簡單入門antd
RxJS是一個異步編程的庫,同時它經過observable序列來實現基於事件的編程,它使編寫異步或基於回調的代碼更容易。框架
這個問題百度下都能有答案,在我看來,RxJS的最大優點就在於兩點:異步
文字的敘述實在抽象,我就從工做中遇到的第一RxJS的案例來講明。angular4
我遇到的需求是angular中表單的異步校驗功能,須要驗證輸入表單中的名稱後臺是否存在,angular中表單存在異步校驗器,異步校驗器須要你輸出一個觀察者對象,監聽輸入事件,並返回檢驗結果。函數式編程
按照之前的思惟模式,咱們完成這個校驗器的思路應該是:
1. 監聽鍵盤事件或者input的valueChange事件
2.將觸發的事件進行,防抖,去重處理
3. 發送請求到後臺獲取當前的名稱庫(由於數量不大,因此驗證由前端進行)
4. 檢查是否存在
寫出來代碼就是這樣
nameValidator = (control: FormControl) => Observable.create((observer: Observer<ValidationErrors>) => {
let timer: any;
// 監聽valuechange事件
control.valueChanges().subscribe(name => {
clearTimeout(timer)
// 定義400毫秒延時器來防抖
timer = setTimeout(() => {
this._serv.getAnalysisDetail(this.analysisId).subscribe(res => {
const valueSet = res.data.instanceList;
// 檢查名稱是否存在並返回校驗結果
if (valueSet.find(item => item.name === name)) {
observer.next({ nameValidator: true }) // 名稱存在
} else {
observer.next(null) // 名稱不存在
}
observer.complete();
})
}, 400);
})
});
複製代碼
這樣的寫法也是antd中異步校驗器的例子的寫法,也是我當時接到需求提交的代碼,在同事review以後,他用RxJS直接重構了這個函數,代碼量大幅減小,可讀性也增長了
nameValidator = (control: FormControl) => this.instanceLen ? control.valueChanges.pipe(
debounceTime(400), // 防抖
switchMap(
name => zip(this._serv.getAnalysisDetail(this.analysisId), of(name)) // 將名稱和請求結果合併輸出
),
map(([res, name]: any[]) => {
// 檢查並返回結果
const nameCheck = res.data.instanceList ? !!res.data.instanceList.find(item => item.name === name) : false;
return nameCheck ? control.setErrors({ nameValidator: true }) : control.setErrors(null);
})
) : of(null)
複製代碼
RxJS將思路徹底轉化爲了一種‘流式編程’的思想
RxJS將各類繁雜的回調函數用事件流的方式展示出來,只要你知道相應的語法和api,不用註釋也能清楚這個流程,代碼可讀性大大增長。
官網上列了六個須要學習的內容,而我從實際應用中,經常使用和必須掌握的是這四點
而這其中最重要的就是obserable的理解和subject的理解使用。
我計劃在以後的幾篇文章中,對RxJS的這些方面進行一遍梳理,而且探究它在狀態管理等其餘方面的應用,但願對本身,對新學習RxJS的人能有所幫助,你們都能寫出優雅簡潔的代碼。