亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 2 個可觀察量發出的值作為 http 請求的參數,其中 1 個可觀察量將另一個重置為默認

如何使用 2 個可觀察量發出的值作為 http 請求的參數,其中 1 個可觀察量將另一個重置為默認

GCT1015 2023-07-14 09:56:01
我正在訂閱一個基于其他 2 個可觀察量的映射可觀察量。每當兩者中的任何一個發出值時,我希望映射的可觀察值發出。每當外部可觀察值發出時,內部可觀察值應重置為默認值(示例中為 0)。問題是,當我重置內部值時,會發出一個額外的值。(對于上下文 - 2 個可觀察量為 http 請求提供參數,這是映射的可觀察量。新的外部值應將內部值重置為 0)const outer = new Subject();const inner = new BehaviorSubject(0);const http = of("");let mapped = outer.pipe(  tap(() => inner.next(0)),  switchMap(outerVal => {    return inner.pipe(map(innerVal => ({ innerVal, outerVal })));  }),  switchMap(({ innerVal, outerVal }) => {    return http.pipe(tap(() => console.log("http: ", outerVal, innerVal)));  }));mapped.subscribe(result => {  console.log(result);});outer.next("first");inner.next(1);inner.next(2);outer.next("second");inner.next(3);// http: first 0// http: first 1// http: first 2// http: first 0 <--- extra// http: second 0// http: second 3我知道為什么會發生這種情況,但我不知道如何處理。我有一個解決方案,可以在該 stackblitz 的底部獲得正確的結果,但我認為它會導致內存泄漏。https://stackblitz.com/edit/rxjs-mxc5wq?file=index.ts
查看完整描述

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工作原理)。


查看完整回答
反對 回復 2023-07-14
?
BIG陽

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);


查看完整回答
反對 回復 2023-07-14
  • 2 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號