【发布时间】:2020-07-07 21:26:44
【问题描述】:
我有一个计时器(它可以触发 observable)——我将它放在服务构造函数中。假设它每 10 秒获取一次数据(代码是手动复制的,而不是复制粘贴,请见谅):
@Injectable({
provideIn: "root",
})
export class myService {
isGetFullData: boolean;
subscription: Subscription;
myDataSubject = new Subject<any>;
myDataSubjectChanged : Observable<any> = this.myDataSubject.asObservable();
constructor(private httpClient: HttpClient) {
this.subscription = timer(0, 10000)
.pipe(switchMap(() => this.getData()))
.subscribe();
}
getData(): Observable<any> {
return this.httpClient.get<any>(url).
pipe
(
tap(res =>
{
this.myDataSubject.next(res);
}),
catchError(error => throwError(error))
);
/* The data depends on the isGetFullData variable. */
}
}
服务被注入到需要其数据的组件中。 现在 - 我有一个不同的组件可能会改变 isGetFullData 变量。 当这个变量改变值时,我不想立即执行 getData(),结果 - 计时器再次开始他的周期,从那个点开始。
这是更改服务的 isGetFullData 值的组件:
export class myComponent {
constructor(private mySrv: myService) {}
ToggleGetDataStatus() {
this.mySrv.isGetFullData = !this.mySrv.isGetFullData;
}
}
【问题讨论】:
-
你没有使用定时器发出的值,那么
the timer starts his cycles again是什么意思 -
@RafiHenig - 我正在使用它,我已将其添加到代码中 - 我正在设置 myDataSubject 并在相关组件中监听 myDataSubjectChanged 可观察对象。
-
是的,但你没有使用数值,所以为什么要重置计时器
-
@RafiHenig - 我想将第一个请求设为“0 时间”,然后每 10 秒一次,尽管 - 我倾向于承认 - 立即执行 api 调用并让计时器继续。这可能会导致 API 调用和 1 或 2 或 3 秒后由计时器触发的另一个调用。