【发布时间】:2017-07-11 16:56:12
【问题描述】:
我编写了一个函数来对一个也可以进行分页的 API 进行轮询。为此,分页是使用 Subject Observable 完成的,轮询是使用 timer 方法完成的(我也尝试了间隔,结果相同)。
这是我的代码:
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 请求被触发,但没有其他请求被发送到服务器直到使用分页。 第一次使用分页后,轮询也开始工作。
这是我第一次使用 Observables,所以我很确定我错过了一些东西,但我看不出它可能是什么。
我也尝试过这种方法(也许它缺少 startWith 中的计时器),但它没有改变任何东西。
[...]
.combineLatest(
pagination
)
.startWith([0, {offset: 0, limit: 3}])
[...]
【问题讨论】:
-
combineLatest 仅在两个可观察对象都发出一次 play with the RxJS marbles to see 时才有效。我在想也许你的
startsWith需要在与计时器结合之前应用于分页。 -
这就是马丁在他的解决方案中所建议的(你们都是对的)。我知道 combineLatest 确实会等待所有的 observables,但我不知何故认为 startWith 会自动启动两个 Observables。我错了;)
标签: angular typescript rxjs polling rxjs5