微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在应用程序中安排1个计时器-服务不是单例?

如何解决如何在应用程序中安排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 举报,一经查实,本站将立刻删除。