我写了一个函数来轮询一个API,该API还能够进行分页。这里使用Subject Observable进行分页,使用timer方法进行轮询(我也尝试过使用相同结果的interval)。
下面是我的代码:
预期的行为应该是: 每5秒发送一个HTTP请求,当用户更改页面时也会发送请求。
实际情况是: 首先发送第一个HTTP请求,但在使用分页之前不会向服务器发送其他请求。 在第一次使用分页后,轮询开始工作。
这是我第一次使用Observables,所以我很确定我错过了什么,但我看不出可能是什么。
我还尝试了这种方法(也许在startWith中缺少计时器计数器),但它没有改变任何东西。
下面是我的代码:
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);
}
预期的行为应该是: 每5秒发送一个HTTP请求,当用户更改页面时也会发送请求。
实际情况是: 首先发送第一个HTTP请求,但在使用分页之前不会向服务器发送其他请求。 在第一次使用分页后,轮询开始工作。
这是我第一次使用Observables,所以我很确定我错过了什么,但我看不出可能是什么。
我还尝试了这种方法(也许在startWith中缺少计时器计数器),但它没有改变任何东西。
[...]
.combineLatest(
pagination
)
.startWith([0, {offset: 0, limit: 3}])
[...]
startsWith
应用于分页,然后再与计时器组合。 - Adam