【发布时间】:2018-10-08 06:48:42
【问题描述】:
嘿,我是 rxjs 和 ngrx 的新手,我正在使用这些技术构建应用程序。 我正在考虑如何使用 rxjs 可观察对象和运算符创建轮询系统。
我创建了一个基本的轮询系统,其中包含可观察对象的订阅地图。每个 observable 每 5 秒向 ngrx-effects 派发一个动作,ngrx-effects 处理该动作并使用服务执行 http 调用等副作用。
我的问题是我想为当前的池系统创建一个特定的机制,它具有以下条件:
1.第一个池立即发生,我为此使用 timer(0,poolingTime), 或与stratwith(null)的管道间隔。
2.池知道根据前一个请求的时间延迟它的下一个请求。我的意思是当前一个请求完成时,第二个请求发生。
第一个条件是我一个人实现的,第二个条件(2)我需要帮助来实现这一点。 为了完成第二个条件,我很想去抖动或节流,但正如我首先所说的那样,我对 rxjs 没有很多经验。
这是我的简单池系统的代码
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subscription } from 'rxjs/Subscription';
import { timer } from 'rxjs/observable/timer';
import { interval } from 'rxjs/observable/interval';
import { throttleTime, debounceTime, startWith, tap, delay } from 'rxjs/operators';
import { Utils } from '../utils';
@Injectable()
export class PoolingService {
private subscriptions: { [id: string]: Subscription };
constructor() {
this.subscriptions = {};
}
public startPooling(time: number, callback: Function): string {
const id = Utils.guid();
const interval$ = interval(time).pipe(tap(tick => console.log("tick", tick))).pipe(startWith(null));
// const interval$ = timer(0, time).pipe(tap(tick => console.log("tick", tick)));
const subscription = interval$.subscribe(() => { callback() });
this.subscriptions[id] = subscription;
return id;
}
public stopPooling(id: string) {
const subscription = this.subscriptions[id];
if (!subscription) {
return;
}
subscription.unsubscribe();
}
}
这是投票服务的使用:
ngOnInit() {
this.store.select('domains').subscribe((state: any) => {
const { list, lastAddedDomain } = state;
this.markers = list;
this.roots = Utils.list_to_tree(list);
});
this.poolService.startPooling(5000, () => {
this.store.dispatch(new AllHttpActions.HttpActionGet({}, HttpMethods.GET, "/getDomainsForMap", AllDomainActions.FETCH_DOMAINS, Utils.guid()));
});
}
【问题讨论】:
-
你的意思是 polling/poll 而不是 pooling/pool?
-
是的,我的错误我会改正的
标签: angular typescript rxjs5 ngrx-store ngrx-effects