[英]combineLatest reset observable - Rxjs
我在“combineLatest”中有 4 個 observables。 我需要的是,如果 observables 1、3 或 4 發出一個值,則 observable 2 會重置其值。 這是可能的? 謝謝
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.