Call a function every x seconds in Angular


This is a quick solution to retrieve the results every x seconds or minutes.

It creates a subscription to a RxJS function timer. This function creates an Observable that emit a result after a certain time.

Example

To call the http request every 10 seconds:

import {Subscription, timer} from 'rxjs';  
 
timerSubscription: Subscription; 
  
 ngOnInit(): void { 
      // timer(0, 10000) call the function immediately and every 10 seconds 
      this.timerSubscription = timer(0, 10000).pipe( 
      map(() => { 
        this.loadData(); // load data contains the http request 
      }) 
    ).subscribe(); 
} 
     
// don't forget to unsubscribe when the Observable is not necessary anymore 
ngOnDestroy(): void { 
  this.timerSubscription.unsubscribe(); 
} 

Other methods

You have multiple other methods to call regularly a method / external service.

interval

rxjs provides the interval operator. Here you find the interval documentation.

The main difference between interval and timer is that interval emits the first time after the first period has passed (in our example 10 seconds).

timer can wait a specified amount of time before to emit the first time.

import { Observable, Subscription, interval } from 'rxjs'; 
import { switchMap } from 'rxjs/operators'; 
 
... 
 
yourSubscription: Subscription; 
 
ngOnInit() { 
    this.dataSubscription = interval(10000) // Repeat every 10 seconds 
        .pipe( 
            switchMap(() => this.getData()) // Switch to new observable on every interval 
        ) 
        .subscribe(data => { 
            // Do something with the data here 
        }); 
} 
 
ngOnDestroy() { 
    this.yourSubscription.unsubscribe(); // Unsubscribe when the component is destroyed 
} 

In this example, the interval operator emits a value every 10 seconds, which triggers the switchMap operator to switch to the new observable returned by getData().

setInterval - Javascript

If you want to avoid rxjs you can use a more native api: setInterval. setInterval works directly in Javascript without the need of any additional framework.
You can find the documentation and some examples on mozilla.org.

async - await

If you are not afraid to use Promises you can implement the same solution with await and asyc.

Here an example:

data: any; 
 
async ngOnInit() { 
  while (true) { 
    this.data = await this.getData().toPromise(); 
    // Do something with the data here 
    await this.delay(10000); 
  } 
} 
 
delay(milliseconds: number) { 
  return new Promise(resolve => setTimeout(resolve, milliseconds)); 
} 


WebApp built by Marco using SpringBoot, Java 17, Mustache, Markdown and in Azure