Tengo una tienda RxJS angular, donde trato de realizar una solicitud HTTP dentro de un cierto intervalo de tiempo, he probado tanto con la funcionalidad RxJS nativa como con Promesas regulares.
Aquí está mi enfoque para usar promesas regulares
updateLeaderboardHttpRequest(filterBy: CompetitionFilteringOptions) { // const url = this.endpoint.getUrl(); const _interval = setInterval( () => { const httpRes = new Promise(resolve => { const url = this.endpoint.getUrl(); // const response = this.httpClient.get<ServerResponse>(url, this.endpoint.createLeaderboardParams(filterBy)).toPromise(); const response = this.httpClient.get('https://random-data-api.com/api/cannabis/random_cannabis?size=30').toPromise(); console.log('making request') console.log(response) resolve(response); }); httpRes.then(res =>{ console.log(res) }) }, 10000); He hecho algunas declaraciones de console.log() para garantizar que las solicitudes se activen correctamente.
En la consola, puedo ver que la respuesta que se registra se cierra correctamente, pero el problema principal es que en la pestaña de red, la solicitud solo se activa una o dos veces y luego solo registra la misma respuesta una y otra vez. .
Creo que tiene un problema con la obtención de datos de forma asíncrona. Intente suscribirse en su httpClient.get y debería funcionar:
this.httpClient.get('https://random-data-api.com/api/cannabis/random_cannabis?size=30').subscribe(res=>{ console.log(res); })Editar: no sé exactamente lo que quiere lograr, pero según tengo entendido, seguiría el siguiente camino para obtener la funcionalidad completa:
ngOnInit(): void { this.interval = setInterval(() => this.updateLeaderboardHttpRequest(filterOptions), 10000); } updateLeaderboardHttpRequest(filterBy: CompetitionFilteringOptions) { this.httpClient.get('https://random-data-api.com/api/cannabis/random_cannabis?size=30').subscribe(res=>{ console.log(res); // Update binding to DOM or fire EventEmitter to which any other component can subscribe. }); } ngOnDestroy() { if (this.interval) { clearInterval(this.interval); } }