J'obtiens actuellement la nouvelle valeur utilisateur mise à jour de cette façon :

 this.Service.user$.subscribe(data => {
      this.userData = data;
      this.userId = data._id;
    });

Mais le updateUser n'est exécuté que toutes les 5 secondes.

Donc, avant qu'il ne soit chargé, userData et UserId sont vides.

Y a-t-il un moyen d'obtenir les données utilisateur stockées à partir de ce qui est déjà dans le service, au lieu d'attendre 5 secondes pour qu'il soit à nouveau exécuté?

Quelque chose comme:

 this.Service.user$().GET((data:any) => { // gets the value already stored

    });

Comment pourrais-je y parvenir ?

Code de service:

     user$: Observable<any>;


  constructor(private http: HttpClient, private router: Router) {
    this.user$ = this.userChangeSet.asObservable();
  }



  updateUser(object) {
    this.userChangeSet.next(object);
  }

Éditer:

De plus, comment pourrais-je détruire tous les abonnés à l'événement ngOnDestroy ?

0
maria 18 mars 2019 à 04:08

2 réponses

Meilleure réponse

Ce que vous pouvez faire dans votre service, c'est utiliser en interne un BehaviourSubject pour stocker les valeurs, mais l'exposer en tant qu'Observable.

Voici une citation des documents détaillant ce qu'est un BehaviourSubject

L'une des variantes de Subjects est le BehaviorSubject, qui a une notion de « la valeur actuelle ». Il stocke la dernière valeur émise pour ses consommateurs, et chaque fois qu'un nouvel observateur s'abonne, il recevra immédiatement la "valeur actuelle" du BehaviorSubject

Voir ici pour en savoir plus.

Code de service:

private _user$ = new BehaviourSubject<any>(null); // initially null

constructor(private http: HttpClient, private router: Router) {
  this.userChangeSet.subscribe(val => this._user$.next(val))
}

get user$ () {
  return this._user$.asObservable();
}

Ensuite, vous pouvez l'utiliser comme d'habitude dans votre composant.

this.service.user$.subscribe(v => {
  // do stuff here
})

Notez que la première valeur que le composant obtiendra sera nulle puisqu'il s'agit de la valeur initiale du BehaviourSubject.

MODIFIER:

Dans le composant

private _destroyed$ = new Subject();

public ngOnDestroy (): void {
    this._destroyed$.next();
    this._destroyed$.complete();
}

Et puis pour l'abonnement

this.service.user$.pipe(
  takeUntil(this._destroyed$)
).subscribe(v => {
  // do stuff here
})

La façon dont cela fonctionne est que lorsque le sujet détruit $ émet, les observables qui ont redirigé takeUntil(this._destroyed$) se désabonnent de leurs sources respectives.

1
20 mars 2019 à 00:51

Utilisez BehaviorSubject pour userChangeSet. Il émet de la valeur immédiatement lors de la souscription. Exemple:

userChangeSet = new BehaviorSubject<any>(this.currentData);
1
Aleksey Melnikov 18 mars 2019 à 01:42