combineLatest 重置可观察对象 - Rxjs

6

我在"combineLatest"中有4个可观测对象。我希望当可观测对象1、3或4发出值时,可观测对象2重置其值。这可能吗?谢谢。

  1. Mat-table排序更改事件(Sort类)
  2. Mat-table更改页面事件(PageEvent类)
  3. 自定义可观测对象(过滤器)
  4. 自定义可观测对象(其他过滤器)
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")

可观察对象1发出"value"值,其包含"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会发出值为"new value"的新值。

$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")

也许你可以通过将原始的可观察对象源2与可观察对象1、3、4的合并进行映射,创建一个名为observable 2的可观察对象,并用它来“重置”初始值。 - elpddev
重置是什么意思? - martin
@martin,“Observable 2”包含表中显示的当前页(PageEvent类),我需要的是,如果可观察对象1、3或4发出新值,则可观察对象2的值必须再次为1,同时保持其他可观察对象的值,从而使用更新的数据进行HTTP请求。 - avechuche
@elpddev 谢谢你的回答,但是你能给我一个例子吗?在这么多的“合并”中,我有点迷失了。 - avechuche
@avechuche 这是类似于 $bNew = merge($bOrig, merge(a$, c$).pipe(map(() => someInitValue)) 的内容。 - elpddev
2个回答

1
你可以考虑以下策略:
假设我们有 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操作符中。
下一个要解决的问题是额外的http请求。考虑一种情况,我们更改第一个参数,从而更新第二个参数的值。这将产生2个调用。我们只需要1个调用,因此我们将使用switchMap操作符来取消任何早期的请求。
combineLatest([$1, $2, $3, $4]).pipe(
  switchMap(([a, b, c, d])=> callHttp(a, b, c, d))
)

查看这个简单的演示


1

您无法重置可观察对象。

请考虑可观察对象正在观察的内容并进行更改。

例如:

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

谢谢回复。我不明白“merge”如何帮助我。如果可观察对象1输出一个值,我无法访问合并中可观察对象3或4的值,而我需要它们,这就是为什么我使用combineLastest的原因。请看我的示例。 - avechuche
我是想让你在combineLatest的基础上再做一些补充,而不是替代它。 - Miri Gold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接