如何在应用程序中安排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呼叫。