Angular 6 - run method in service every 10 seconds

前端 未结 7 1951
难免孤独
难免孤独 2020-12-14 02:52

I have this service using HttpClient to get some data :

checkData() {
    return this.http.get(\'my url\');
}

The on the footer component I

相关标签:
7条回答
  • 2020-12-14 03:28

    Try with timer from RxJS :

    import { Subscription, timer } from 'rxjs';
    import { switchMap } from 'rxjs/operators';
    
    subscription: Subscription;
    statusText: string;
    
    ngOnInit() {
        this.subscription = timer(0, 10000).pipe(
          switchMap(() => this.myservice.checkdata())
        ).subscribe(result => this.statustext = result);
    }
    
    ngOnDestroy() {
        this.subscription.unsubscribe();
    }
    

    interval(10000) from RxJS is not appropriate, because it will start to emit values ONLY after 10sec and not immediatly for the first time (and I think that's not what you're looking for).

    However, timer(0, 10000), will emit values immediatly (0) and every 10sec (10000) until unsubscription.

    0 讨论(0)
  • 2020-12-14 03:33

    In your checkData method you could do something like this:

    import { timer, of } from 'rxjs';
    import { switchMap, catchError } from 'rxjs/operators';
    
    checkData() {
        return timer(0, 10000)
            .pipe(
               switchMap(_ => this.http.get('my url')),
               catchError(error => of(`Bad request: ${error}`))
            );
    }
    

    Then your subscribe will get the result of the http call every 10 seconds.

    0 讨论(0)
  • 2020-12-14 03:38

    Use rxjs timer to call the api request at startup and then every 10s.

    This is best achieved by using rxjs to divide and conquer.

    Firstly, import the following:

    import { timer, Observable, Subject } from 'rxjs';
    import { switchMap, takeUntil, catchError } from 'rxjs/operators';
    

    Then add the property to handle request to the api:

    private fetchData$: Observable<string> = this.myservice.checkdata();
    

    Next, add the property to handle the timing:

    private refreshInterval$: Observable<string> = timer(0, 1000)
    .pipe(
      // This kills the request if the user closes the component 
      takeUntil(this.killTrigger),
      // switchMap cancels the last request, if no response have been received since last tick
      switchMap(() => this.fetchData$),
      // catchError handles http throws 
      catchError(error => of('Error'))
    );
    

    At last, fire the kill command if the component is killed:

    ngOnDestroy(){
      this.killTrigger.next();
    }
    

    Here is a StackBlitz Demo.

    0 讨论(0)
  • 2020-12-14 03:39

    The rxjs way to do this would be the following.

    import { interval } from 'rxjs/observable/interval';
    import { map } from 'rxjs/operators';
    
    const timeInterval$ = interval(10000);
    
    timeInterval$.pipe(
      map( () => this.http.get(//some url);
    );
    
    0 讨论(0)
  • 2020-12-14 03:43

    Hope this will help you

    export class YourComponent implements OnInit, OnDestroy {
      private alive: boolean;
    
      constructor(){}
    
      ngOnInit(){
        this.alive = true;
        TimerObservable.create(0, 10000)
          .pipe(
            takeWhile(() => this.alive)
          )
          .subscribe(() => {
            this.myservice.checkdata().subscribe( result => { this.statustext = result } );
          });
      }
    
      ngOnDestroy(){
        this.alive = false;
      }
    }
    
    0 讨论(0)
  • 2020-12-14 03:44

    You can use the setInterval which is quite simple

    setInterval(console.log('hi'), 10000);
    

    This runs for every 10 secs

    0 讨论(0)
提交回复
热议问题