簡體   English   中英

combineLatest 重置 observable - Rxjs

[英]combineLatest reset observable - Rxjs

我在“combineLatest”中有 4 個 observables。 我需要的是,如果 observables 1、3 或 4 發出一個值,則 observable 2 會重置其值。 這是可能的? 謝謝

  1. Mat-table 排序更改事件(排序類)
  2. Mat-table 更改頁面事件(PageEvent 類)
  3. 自定義 observable(過濾器)
  4. 自定義 observable(其他過濾器)
combineLatest($1, $2, $3, $4).subscribe(([a, b, c, d]) => CALL_HTTP_WITH_PARAMETERS(a, b, c, d))

示例(第一個值)

$1 = name,asc
$2 = 2
$3 = bla bla
$4 = bla bla

CALL_HTTP_WITH_PARAMETERS("name,asc", 2, "bla bla", "bla bla")

Observable 1 發出“name,desc”值

$1 = name,desc
$2 = 2 ==> has to be 1 again
$3 = bla bla
$4 = bla bla

CALL_HTTP_WITH_PARAMETERS("name,desc", 1, "bla bla", "bla bla")

其他

Observable 3 發出“新值”值

$1 = name,asc
$2 = 2 ==> has to be 1 again
$3 = new value
$4 = bla bla

CALL_HTTP_WITH_PARAMETERS("name,asc", 1, "new value", "bla bla")

您無法重置 observable。

想想 observable 正在觀察什么並改變它。

例如:

merge($1, $3, $4).pipe(
   tap(_=> this.myGrid.setPage(1))
).subscribe()

或者,如果它超出您的控制,請創建Subject並使用next

例如:

subject2 = new Subject<number>();
$2 = this.subject2.asObservable();
onPageChanged(pageNumber:number){
   this.subject2.next(pageNumber);
}

merge($1, $3, $4).pipe(
   tap(_=> this.subject2.next(1))
).subscribe()

你可以,考慮以下策略

假設我們有Observables $a , $b , $c$d ,我們將它們定義為Subjects

我們希望$a$c$d重置$b 我們可以通過管道將這些Observables重置$b

const $aSubject = new Subject()
const $bSubject = new Subject()
const $cSubject = new Subject()
const $dSubject = new Subject()
const $a = $aSubject.asObservable().pipe(
  tap(() => $bSubject.next(0))
)
const $b = $bSubject.asObservable()
const $c = $cSubject.asObservable().pipe(
  tap(() => $bSubject.next(0))
)
const $d = $dSubject.asObservable().pipe(
  tap(() => $bSubject.next(0))
)

現在我們已經成功地更新了$b其余變量的變化。 不幸的是,這會導致無限循環,因為$b將始終在combineLatest()函數中發出。 為了解決這個問題,我們將這些Observable通過管道傳遞給distinctUntilChanged操作符。

下一個要解決的問題是額外的 httpCalls。 考慮一種情況,我們更改第一個參數,從而更新第二個參數的值。 這將進行 2 個調用。 我們只需要 1 次調用,因此我們將使用switchMap操作符來取消任何先前的請求

combineLatest([$1, $2, $3, $4]).pipe(
  switchMap(([a, b, c, d])=> callHttp(a, b, c, d))
)

看這個簡單的演示

暫無
暫無

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

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