forkJoin
1.特點:在每個被合并的流都發出complete信號時,發射一次也是唯一一次數據;
const ob1 = Rx.Observable.interval(1000).map(d => `ob1:$tc59ppk`).take(3);
const ob2 = Rx.Observable.interval(2000).map(d => `ob2:$xqjvkrq`).take(2);
Rx.Observable.forkJoin(ob1, ob2).subscribe((data) => console.log(data));
// ["ob1:2", "ob2:1"]:ob1在發射完第三個數據時發出complete信號,ob2在發射完第二個數據時發射出complete信號,forkJoin等ob1和ob2都結束時發射一次數據;
2.適用場景:有一組流,當你只關心每個流的最終發射值,即這種序列只有一次發射 — 類似 Promise.all()
(1)對于一個發出多個值的流,除了最后發出的一個值之外,其他的值都會忽略;
(2)當所有內部流完成時,生成的流只發出一次 — 如果任何內部流沒有完成,它將永遠不會完成,如果任何內部流出錯,它將拋出一個錯誤;
zip
1.特點:當每個被合并的流都發射了新數據,zip將其合并為數組發射出去,直到其中某個流發出complete信號,整個被合并的流結束不再發射數據;
const ob1 = Rx.Observable.interval(1000).map(d => `ob1:$aheqf53`).take(3);
const ob2 = Rx.Observable.interval(2000).map(d => `ob2:$kkyhnyr`).take(2);
Rx.Observable.zip(ob1, ob2).subscribe({
next: (data) => console.log(data),
complete: () => console.log('complete')
});
// ["ob1:0", "ob2:0"] ob1等待ob2發射數據,之后合并
// ["ob1:1", "ob2:1"] 此時ob2結束,整個合并的流也結束
// "complete"
2.適用場景:有一組流,當你關心這一組流的最新發射值集合,即它等待從所有輸入流中發出相應的值,然后將它們轉換成單個值數組并發出結果;
(1)只有當每個源序列中有一對新值時,它才會發布,因此如果其中一個源序列發布值的速度快于另一個序列,發布速率將由兩個序列中較慢的一個決定;
(2)當任何內部流完成并且相應的匹配對從其他流發出時,結果流完成。如果任何內部流沒有完成,它將永遠不會完成,如果任何內部流出錯,它將拋出一個錯誤;
combineLatest
1.特點:第一次等待被合并的流發出新數據,但在合并時,若其中有流在等待其他流發射數據期間又發射了新數據,則使用該流的新數據進行合并,之后只要某個流發射新數據,不再等待其他流同步發出數據,而是使用其他流的最近一次數據進行合并,直至所有數據發出complete信號;
const ob1 = Rx.Observable.interval(1000).map(d => `ob1:$t2mayma`).take(3);
const ob2 = Rx.Observable.interval(2000).map(d => `ob2:$0hebyda`).take(2);
Rx.Observable.combineLatest(ob1, ob2).subscribe({
next: (data) => console.log(data),
complete: () => console.log('complete')
});
// ["ob1:1", "ob2:0"] ob1等待ob2發射,當ob2發射時ob1已經發射了第二次數據,使用ob1的第二次數據
// ["ob1:2", "ob2:0"] ob1繼續發射第三次也是最后一次數據,ob2雖然還未發射,但是可以使用它上一次的數據
// ["ob1:2", "ob2:1"] ob2發射第二次也是最后一次數據,使ob1上一次的數據。
// "complete"
2.適用場景:有一組流,當你關心這一組流的任一一個流的最新發射值,即需要在部分狀態發生變化時保持最新;
(1)RxJs緩存每個輸入序列的最后一個值,一旦所有序列產生了至少一個值,它就使用從緩存中獲取各個流當前的最新值來計算結果值,然后通過結果流發出該計算的輸出;
(2)如果某個輸入流不發出任何值并且永遠不會完成,combineLatest也永遠不會發出并且永遠不會完成,因為它將再次等待所有流中某個流發出某個值;
【總結】:forkJoin僅會合并各個子流最后發射的一次數據,觸發一次回調;zip是只要被合并的流均發射了新數據則將其合并發射,之后繼續等待至某個流結束;combineLatest是只要被合并的流有一個發射新數據則將發射合并數據,直至所有流結束;