簡體   English   中英

RxJS combineLatest 每個路徑只發射一次

[英]RxJS combineLatest emit only once per path

有沒有什么方法/模式可以使用combineLatest()或其他一些運算符,這樣如果組合的可觀察對象相互依賴,它們只會為 DAG 中具有相同來源的每組路徑只發射一次? 我認為用圖表解釋可能更容易。

圖表:

   A C
  /| |
 B | |
  \|/
   D

這里 B 訂閱了 A,D 訂閱了 A、B 和 C。默認行為是如果 A 發射,D 發射兩次:一次是 A 發射,一次是 B 發射(作為 A 發射的結果). 我希望它只發射一次,在兩者都發射之后。 但是,如果 C 發射,那么 D 也應該立即發射。

這是代碼:

const A = new Rx.BehaviorSubject(1);
const B = A.pipe(Rx.map((x) => x + 1));
const C = new Rx.BehaviorSubject(3);

const D = Rx.combineLatest({ A, B, C });

D.subscribe(console.log); // {A: 1, B: 2, C: 3}
A.next(2); // Two emissions: {A: 2, B: 2, C: 3}, {A: 2, B: 3, C: 3} 
// Would like the second one ONLY, i.e. {A: 2, B: 3, C: 3}
C.next(4); // Correctly emits: {A: 2, B: 3, C: 4}

我嘗試過的一種解決方案是將其線性化並使 A、B 和 C 的整個集合成為可觀察的:

 {A, C}
    |
{A, C, B}
    |
   {D}

這行得通,但我想知道是否有更好的方法。

如果我理解正確的問題,您希望最終的 Observable D隨時發出AB的上游)或C發出,但是,如果A發出,您還需要B發出的值。

如果是這種情況,我將確保任何時候B發出,它不僅發出B的值,還發出其上游A通知的值,然后我將僅傳遞給combineLatest BC ,就像這樣

const A = new BehaviorSubject(1);
const B = A.pipe(map((x) => [x, x + 1]));
const C = new BehaviorSubject(3);

const D = combineLatest({ B, C }).pipe(
  map((val) => ({ A: val.B[0], B: val.B[1], C: val.C }))
);

您可以將zip A、B 放在一起,因此對於每一對發射,您只能在 D 中得到一個。將其與 C 結合起來,這只是一個:

const A = new BehaviorSubject(1);
const B = A.pipe(map((x) => [x, x + 1]));
const C = new BehaviorSubject(3);


const D = combineLatest({ zip(A,B), C })

這需要 A 和 B 都發出一個值,但是因為它們相互依賴,所以在您的示例中這不是問題。

https://www.learnrxjs.io/learn-rxjs/operators/combination/zip

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM