如何解决如何在应用程序中安排1个计时器-服务不是单例?
我想每X秒发出一次get请求。我在服务构造函数中使用了计时器。该服务被注入使用它的组件中。
我希望该服务(作为单例)每隔X秒调度一次获取请求-作为应用程序中的一个实例,无论将多少个浏览器路由到注入该服务的组件。当前-似乎每个新会话都在启动一个新计时器。
更新:经过调查,我发现根本原因是由于某种原因,该服务不是单例,尽管它被声明为@Injectible(
providerIn:'root'
)。
我什至尝试检查subscription:Subscription变量-看看它是否已经存在-以及从新路径到达组件(新浏览器)到达它时-它是未定义的,因此没有帮助。
这是我的代码:
服务:
@Injectible(
providedIn: 'root'
)
export class MyService
{
subscribe : Subscription;
dataSubject = new Subject<any>();
datasubjectChanged : Observable<any> = this.dataSubject.asObservable();
constructor(private httpClient : HttpClient)
{
if (!this.subscribe)
{
this.subscribe = timer(0,10000)
.pipe(
switchMap(() => this.getData()
.pipe(catchError(error =>
{
return of ("problems in getting data");
}
)))).subscribe();
}
}
getData(): Observable<any>
{
return this.httpClient.get<any>(<rlevantUrl>).
pipe(response =>
{
this.dataSubject.next(response);
}),catchError(err => {
return throwError(err);
})
}
}
这是组件:
export class Mycomponent(private mySrv : MyService)
{
ngOnInit()
{
let sub = this.mySrv.datasubjectChanged.subscribe(result => dosomething(result));
}
}
解决方法
默认情况下,角服务本质上是单例的,当您将其路由到一个组件时,就会创建它们,并且组件不会被破坏。
除非您将其添加到组件的提供程序中。
如果您想make get request every X seconds
,可以使用rxjs
interval
// RxJS v6+
import { interval } from 'rxjs';
//emit value in sequence every 1 second
const source = interval(1000);
//output: 0,1,2,3,4,5....
const subscribe = source.subscribe(val => console.log(val));
并基本上在其中进行http呼叫。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。