Could any one please help as how can we poll a rest API on a page every 5 seconds until a certain condition is met. This is for login with code displayed on TV
You can achieve this using Registry.setInterval()
method.
Thanks a lot but how do I use it with the router since my current API calls are done using before in routes
Hi @prashant.chothani . I think you’d need a provide to the return statement of your route hook a Promise, which would then be resolved from inside the setInterval. Then, once resolved, the navigation would proceed as usual.
Hope that helps.
Hi @eduardo.guzman thanks for taking an effort. What i want that on a page i am displaying a Code and then want to poll a service on that page. The user has maps this device (where the lightning app has displayed this code) using the browser or another app. This happens outside of the lightning app. While this is being done, the lighting app where the code is displayed, calls a service, every 5 seconds and then get the bearer token and access token. How do i poll this within the page where the code is displayed. Can i call a function there using Register.setInterval() what you suggested ?
Another way to achieve this is with Rxjs instead of setInterval, which gives you finer control over what is happening and may be better to suit your needs.
import { interval } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
const destroy$ = new Subject();
interval(5000)
.pipe(
takeUntil(destroy$),
switchMap(() => {
return http.get('/api/messages');
})
)
.subscribe(() => {
// handle the reponse
});
// later when you want to stop polling
destroy$.next();
destroy$.complete();
The key points:
- Use
interval
to create an observable that emits every 5 seconds - Pipe through
takeUntil
and pass aSubject
calleddestroy$
- Subscribe to start executing the polling
- When you want to stop, call
next()
andcomplete()
ondestroy$
- This will complete the
takeUntil
and stop the polling
The destroy$
observable is a common pattern for creating a signal to stop observables. Call next()
to send a value, and complete()
to actually complete the observable.
export class Pairing extends Lightning.Component {
_active() {
this._interval = setInterval(() => {
fetch('http://auth.api/status?code=12345').then(response => {
if (response.status === 200) {
Router.navigate('home')
}
}, 5000)
})
}
_inactive() {
clearInterval(this._interval)
}
}
It’s up to you to build an appropriate UI, add your API configuration, and fetch the pairing code in advance, ofc.
Also this example shows a simplified approach, normally you would need to separate the API communication layer from views and probably add some intermediate state management layer, for example rxjs
like @dgmip suggested, or redux
, effector
, etc.