[英]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
隨時發出A
( B
的上游)或C
發出,但是,如果A
發出,您還需要B
發出的值。
如果是這種情況,我將確保任何時候B
發出,它不僅發出B
的值,還發出其上游A
通知的值,然后我將僅傳遞給combineLatest
B
和C
,就像這樣
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.