typescript 合并Latest -相同的observable返回不同的值

ncgqoxb0  于 2023-06-07  发布在  TypeScript
关注(0)|答案(2)|浏览(136)

如何在不多次调用的情况下从同一个observable返回不同的值?我打算只订阅一次firstObs$,但返回值和sumFromValues。

combineLatest([
            this.firstObs$,
            this.firstObs$.pipe(
                switchMap(someOperation => {
                       return this.observableSumOperation(someOperation.first, someOperation.second)
                })
            ),
          
            this.anotherObservable$,
        ])
          .subscribe(([values, sumFromValues, anotherValues]) => {
            }
wh6knrhe

wh6knrhe1#

正如您所注意到的,当您在combineLatest中包含相同的源可观察值时,“combinelatest observable”将发出多次。通常这是不期望的。
我可以想到两个解决方案:
1.使用debounceTime(0)抑制在同一事件循环中发生的发射:

combineLatest([
  firstObs$,
  firstObs$.pipe(map(({first, second}) => first + second)),
  anotherObservable$,
])
.pipe(debounceTime(0));

1.在combineLatest中只包含一次每个源,并使用map构建一个包含派生值的新数组/对象:

combineLatest([
  firstObs$,
  anotherObservable$,
])
.pipe(
  map(([values, anotherValues]) => [
    values,
    values.first + values.second,
    anotherValues
  ])
);

下面是一个StackBlitz,它显示了问题和解决方案。

pprl5pva

pprl5pva2#

由于您没有指定anotherObservable包含什么以及它的行为方式,因此很难说如何最好地合并这些值。但有一个想法是将可观测量的组合分为两个步骤:
1.将firstObs$结果与observableSumOperationMap在一起

const calculated$ = this.firstObs$.pipe(
      mergeMap((values) =>
        this.observableSumOperation(values.first, values.second).pipe(
          map((sum) => ({ ...values, sum })),
        ),
      ),
    )

1.将calculated$anotherObservable$合并:

combineLatest([calculated$, this.anotherObservable$]).subscribe(
      ([values, anotherValues]) => {
        const { first, second, sum } = values
      },
    )

请注意,combineLatest只有在everyobservable至少发出一次时才会触发。因此,如果anotherObservable$不发出值,则不会输入subscribe方法

相关问题