angular – RxJS Observable with Subject,通过计时器和combineL
发布时间:2020-12-17 17:09:12 所属栏目:安全 来源:网络整理
导读:我写了一个函数来对一个也可以进行分页的API进行轮询.因此,使用Subject Observable完成分页,并使用计时器方法完成轮询(我也尝试使用相同结果的间隔). 这是我的代码: getItems(pagination: SubjectPagination): ObservableListResultItem { let params: URLS
我写了一个函数来对一个也可以进行分页的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); } 预期的行为是: 这是发生的事情: 这是我第一次使用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)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |