结合最新重置可观察 - Rxjs

ave*_*che 6 javascript rxjs typescript angular

我在“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))
Run Code Online (Sandbox Code Playgroud)

示例(第一个值)

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

CALL_HTTP_WITH_PARAMETERS("name,asc", 2, "bla bla", "bla bla")
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

其他

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")
Run Code Online (Sandbox Code Playgroud)

Owe*_*vin 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))
)
Run Code Online (Sandbox Code Playgroud)

现在我们已经成功更新$b了其余变量的变化。不幸的是,这会导致无限循环,因为它$b总是在combineLatest()函数中发出。为了解决这个问题,我们将它们通过管道传递ObservabledistinctUntilChanged操作员。

下一个要解决的问题是额外的 httpCalls。考虑这样一种情况:我们更改第一个参数,从而更新第二个参数的值。这将拨打 2 次电话。我们只需要 1 次调用,因此我们将使用switchMap操作员取消任何先前的请求

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

看这个简单的演示