ave*_*che 6 javascript rxjs typescript angular
我在“combineLatest”中有 4 个可观察值。我需要的是,如果可观察值 1、3 或 4 发出一个值,则可观察值 2 会重置其值。这是可能的?谢谢
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)
您可以考虑以下策略
假设我们有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()函数中发出。为了解决这个问题,我们将它们通过管道传递Observable给distinctUntilChanged操作员。
下一个要解决的问题是额外的 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)
| 归档时间: |
|
| 查看次数: |
1504 次 |
| 最近记录: |