2 回答

TA貢獻1942條經驗 獲得超3個贊
以下有您想要的輸出。我不確定它是否符合您的標準。你內心的可觀察是否有理由必須成為行為主體?如果只是給它一個初始值,那么startWith操作員會做得更干凈。
const outer = new Subject();
const inner = new Subject();
const http = of("");
const mapped = outer.pipe(
switchMap(outerVal =>
inner.pipe(
startWith(0),
map(innerVal => ({ innerVal, outerVal }))
)
),
switchMap(({ innerVal, outerVal }) =>
http.pipe(
tap(() => console.log("http: ", outerVal, innerVal))
)
)
);
mapped.subscribe(console.log); // ""
你的 stackblitz 內存泄漏
您正在創建長期存在的多播流,但從未完成它們。你可以嘗試:
tap(() => {
inner2.complete();
inner2 = new BehaviorSubject(0);
}),
SwitchMap 將取消訂閱,但多播流在取消訂閱時不會完成(取決于其refcount工作原理)。

TA貢獻1859條經驗 獲得超6個贊
考慮下面的方法,我將兩個Observable流和過濾器組合起來只發出 1 個值。然后我們可以使用新的流與http請求合并
const http = of("");
const triggerSubject$ = new BehaviorSubject({ inner: 0, outer: null });
const trigger = triggerSubject$.pipe(
? filter(({ inner, outer }) => inner && outer)
);
const triggerInner = val => {
? console.log("Inner", val);
? return triggerSubject$.next({
? ? inner: val,
? ? outer: triggerSubject$.value.outer
? });
};
const triggerOuter = val => {
? console.log("Outer", val);
? return triggerSubject$.next({ inner: 0, outer: val });
};
const mapped = trigger.pipe(
? switchMap(({ inner: innerVal, outer: outerVal }) =>
? ? http.pipe(tap(() => console.log("http: ", outerVal, innerVal)))
? )
);
mapped.subscribe(result => {
? console.log(result);
});
triggerOuter("first");
triggerInner(1);
triggerInner(2);
triggerOuter("second");
triggerInner(3);
添加回答
舉報