0
votes

mettre à jour la valeur de l'abonnement

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.


0 commentaires

3 Réponses :


1
votes

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)),
  );
}


0 commentaires

0
votes

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!') }); ) }


0 commentaires

0
votes

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;
}


0 commentaires