angular – RxJS Observable with Subject,通过计时器和combineLatest进行轮询不会触发

前端之家收集整理的这篇文章主要介绍了angular – RxJS Observable with Subject,通过计时器和combineLatest进行轮询不会触发前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个函数来对一个也可以进行分页的API进行轮询.因此,使用Subject Observable完成分页,并使用计时器方法完成轮询(我也尝试使用相同结果的间隔).

这是我的代码

getItems(pagination: Subject<Pagination>): Observable<ListResult<Item>> {
    let params: URLSearchParams = new URLSearchParams();

    return Observable
      .timer(0,5000)
      .combineLatest(
        pagination,(timer,pagination) => pagination
      )
      .startWith({offset: 0,limit: 3})
      .switchMap(pagination => {
        params.set('skip',pagination.offset.toString());
        params.set('limit',pagination.limit.toString());
        return this.authHttp.get(`${environment.apiBase}/items`,{search: params})
      })
      .map(response => response.json() as ListResult<Item>)
      .catch(this.handleError);
  }

预期的行为是:
HTTP请求每5秒触发一次,当用户更改页面时.

这是发生的事情:
第一个HTTP请求被触发,但是没有其他请求被发送到服务器UNTIL使用分页.
在第一次使用分页后,轮询也开始工作.

这是我第一次使用Observables,所以我很确定我错过了什么,但我看不出它可能是什么.

我也试过这种方法(也许它在startWith中缺少计时器计数器),但它没有改变任何东西.

[...]
  .combineLatest(
    pagination
  )
  .startWith([0,{offset: 0,limit: 3}])
[...]

解决方法

combineLatest()运算符要求所有源Observable都发出至少一个项.

您的演示只生成一个请求,因为您正在使用.startWith(). combineLatest()永远不会发出,因为分页是一个主题,它可能永远不会发出任何项目.

所以一个选择是移动.startWith():

.combineLatest(
  pagination.startWith({offset: 0,limit: 3}),pagination) => pagination
)

但也许这对你没什么帮助,因为你忽略了来自计时器的所有项目()而你只是使用了分页.所以也许你可以使用merge()从其中一个源刷新列表.然后timer()独立地增加偏移量.

Observable
  .timer(0,1000)
  .map(i => { return {offset: i*3,limit: 3}})
  .merge(pagination.startWith({offset: 0,limit: 3}))
  .switchMap(pagination => {
    return Observable.of(pagination).delay(200)
  })
  .subscribe(val => console.log(val));

猜你在找的Angularjs相关文章