J'ai un appel d'API périodique de service qui change l'URL si c'est la première fois qu'il est appelé.
Il a un abonnement d'intervalle pour générer un appel d'API, je ne peux pas utiliser une variable globale car c'est un service qui peut être invoquée sans supprimer l'injecteur.
getData(init: boolean): Observable<any> { const refreshInterval = 5000; const interval = observableInterval(refreshInterval).pipe(startWith(0)) return interval.pipe( flatMap(() => this.http.get<any>(this.getUrl(init))), map((data) => this.doWhateverWithData(data)), ); } getUrl(init: boolean): string { return init ? url1 : url2; }
Mon problème est que init ne change pas et donc l'URL l'est non plus.
Comment puis-je le résoudre?
Comme je l'ai dit, je ne peux pas utiliser this.init à cause de mon code.
3 Réponses :
Votre cas d'utilisation est un peu spécial, mais si vous voulez vraiment changer la variable lors de l'abonnement au flux, vous pouvez utiliser BehaviorSubject
avec withLatestFrom
init$=new BehaviorSubject('initialvalue'); getData(init: boolean): Observable<any> { const refreshInterval = 5000; const interval = observableInterval(refreshInterval).pipe(startWith(0)) return interval.pipe( withLatestFrom(init$), flatMap(res=>this.apiSql.get<any>(this.getUrl(res[1]))), map((data) => this.doWhateverWithData(data)), ); }
Dans rxjs @ 6, vous pouvez utiliser from comme fonction autonome:
import {from} de 'rxjs'; Voir aussi le guide de migration vers rxjs6
https://github.com/ReactiveX/rxjs /blob/master/MIGRATION.md#import-paths
MISE À JOUR
Vous devez passer à la syntaxe pipe, assurez-vous d'importer tous les opérateurs utilisés depuis rxjs / operators. Par exemple:
importer {map, filter, catchError, mergeMap} depuis 'rxjs / operators';
getDataListApi () { return this.http.get ("/ api / method") tuyau( map ((data: any []) => { this.products = données; // ici, vous pouvez mettre à jour vos données selon vos besoins retourne vrai; }), catchError (erreur => { return throwError ('Un problème est survenu!') }); ) }
Je le résous. Il suffit de changer le début par dans l'intervalle et de vérifier la valeur dans flapMap
getData(): Observable<any> { const refreshInterval = 5000; const interval = observableInterval(refreshInterval).pipe(startWith(-1)) return interval.pipe( flatMap((index) => this.http.get<any>(this.getUrl(index))), map((data) => this.doWhateverWithData(data)), ); } getUrl(index: number): string { return (index === -1) ? url1 : url2; }