rxjs:如何理解这个组合的最新行为

rxjs: how to understand this combinelastest behavior

在我的应用程序中,我遇到了与 combineLatest 运算符相关的奇怪行为。我通过在线演示重现了这个问题:

注意:请忽略此demo中的业务逻辑,不太合理,我只是想在技术层面重现这个问题。

https://stackblitz.com/edit/angular-qcdslo?file=src/app/app.component.ts

  private testRequest() {
    this.pokemon$ = combineLatest(this.limit$, this.offset$)
      .pipe(
        map(data => ({limit: data[0], offset: data[1]})),
        switchMap(data => this.pokemonService.getPokemon(data.limit, data.offset)),
        map((response: {results: Pokemon[]}) => response.results),
      );
  }

此方法使用 combineLatest 组合两个可观察值:limit$ 和 offset$。并向 API 发送请求,其中 limit 和 offset 的值只是 API 的参数。

并且我在以下方法中每 5 秒将计数器值增加 1:

let counter = 1
setInterval(() => {
  this.offsetControl.setValue(counter)
  counter++;
}, 5000)

最后,出于某种原因,我需要每隔 6 秒调用一次 testRequest 方法,方法如下:

setInterval(() => {
  this.testRequest();
}, 6000) 

那么网络请求行为如下:

limit=5&offset=0
limit=5&offset=1  
limit=5&offset=0
limit=5&offset=2 
limit=5&offset=0
limit=5&offset=3  
...
limit=5&offset=0
limit=5&offset=n  

我不明白为什么 limit=5&offset=0 会反复发生。谢谢。

每次执行 testRequest 时,您都在创建一个新的 observable,这不是您想要做的,每次您重新创建 observable 时,您都会获得调用 startsWith 时为零的 startsWith 值。

去掉最新的组合,只从表单控件中提取值。

https://stackblitz.com/edit/angular-droqf6?file=src/app/app.component.ts