RxJs 常用函式整理
RxJs 常用函式整理
過濾
take
陸續發出的值只取到所設定的次數為止,使用的情境是,只對第一個進入的資料感到興趣,只想要拿第一個訂閱的值。 和
skip是相反的的,skip是會跳過起的 n 個值開始
https://rxjs-cn.github.io/learn-rxjs-operators/operators/filtering/take.html
import { of } from "rxjs";
import { take } from "rxjs/operators";
// 發出 1,2,3,4,5
const source = of(1, 2, 3, 4, 5);
// 取第一個發出的值然後完成
const example = source.pipe(take(1));
// 輸出: 1
const subscribe = example.subscribe((val) => console.log(val));
另一個範例
this.headerService.menu$.pipe(
filter((data) => {
return data.applications.length > 0;
}),
switchMap((data: any) => {
... // 處理資料
return zip(...obsvArray).pipe(
map((val) => {
const data = val[0].data;
data.meta = val[1].data.meta;
if (!keyword) data.structuredData = val[1].data.structuredData;
return {
data: data,
};
}));
}),
take(1) // **反回第一個拿到的值**
);
skipUntil
skip

// emit every half second
const source = interval(500);
// skip the first 10 emitted values
const result = source.pipe(skip(10));
result.subscribe((value) => console.log(value));
組合
zip
會把所有內部的值全數發出後,並取得相對應的值
const obsvArray = [this.apiDashboardService.getEditQuotation(route.paramMap.get("quotation_id")), this.apiDashboardService.getQuotationDetail(route.paramMap.get("quotation_id"))];
return zip(...obsvArray).pipe(
map((val) => {
return {
data: {
meta: {
title: `Quotation for ${val[0].data.projectName}`,
},
},
quotationGeneralData: val[0].data,
quotationDetailData: val[1].data,
};
}),
catchError((error) => {
this.router.navigate(["/error_404"]);
return EMPTY;
})
);
forkJoin
// RxJS v6+
import { mergeMap } from "rxjs/operators";
import { forkJoin, of } from "rxjs";
const myPromise = (val) => new Promise((resolve) => setTimeout(() => resolve(`Promise Resolved: ${val}`), 5000));
const source = of([1, 2, 3, 4, 5]);
// 发出数组的全部5个结果
const example = source.pipe(mergeMap((q) => forkJoin(...q.map(myPromise))));
/*
输出:
[
"Promise Resolved: 1",
"Promise Resolved: 2",
"Promise Resolved: 3",
"Promise Resolved: 4",
"Promise Resolved: 5"
]
*/
const subscribe = example.subscribe((val) => console.log(val));