0
votes

Comment puis-je utiliser l'opérateur concat dans RxJS, mais ignorer toutes les émissions de la première observable

Disons que nous avons 2 observables.

const obs1 = timer (1000); const obs2 = sur (1,2,3)

Si je souhaite attendre que obs1 se termine, je pourrais évidemment utiliser l'opérateur concat.

obs1.pipe (concat (obs2)). subscribe (console.log);

ou

concat (obs1, obs2) .subscribe (console.log);

Cela fonctionnerait très bien (l'ordre est conservé), mais le «0» émis par la première obs serait toujours enregistré. Existe-t-il un moyen de forcer l'ordre de certains abonnements, mais d'ignorer les émissions de l'observable donnée? (par exemple, seules les valeurs de la dernière observable dans 'chain' doivent être vues).

Dans ce cas particulier, je sais combien de valeurs attendre, donc je pourrais simplement utiliser skip / takeLast, mais je recherche une solution générique, qui ne m'oblige pas à connaître la quantité d'éléments émis par les observables.


0 commentaires

3 Réponses :


0
votes

Vous pouvez soit switchMap , soit enregistrer les valeurs dans le pipeline de la deuxième observable uniquement:

const obs1 = timer(1000);
const obs2 = of(1, 2, 3);

obs1.pipe(
  concat(obs2.pipe(tap(val => console.log(val))))
).subscribe();

obs1.pipe(
    switchMap(_ => obs2)
).subscribe(console.log);


1 commentaires

tap fonctionnerait, mais j'aimerais voir ces valeurs dans subscribe () Comment pourrais-je utiliser switchMap dans ce cas? Je ne suis pas sûr que ce soit applicable dans ce scénario



3
votes

Vous pouvez utiliser juste ignorelements () . xxx

Peu importe si obs1 émet un Next < / code> notifications ou non. obs1 doit juste fonctionner.


2 commentaires

Et si je voudrais prendre la dernière valeur émise au lieu d'ignorer complètement toutes les valeurs d'OBS1?


Theres takeLast opérateur



1
votes

Utilisez le combineLatest:

Exemple:

import { timer, combineLatest } from 'rxjs';

const timerOne$ = timer(1000, 4000);
const timerTwo$ = timer(2000, 4000);
const timerThree$ = timer(3000, 4000);

combineLatest(
  timerOne$,
  timerTwo$,
  timerThree$,
  // combineLatest also takes an optional projection function
  (one, two, three) => {
    return `${three}`;
  }
).subscribe(console.log);

ou

    import { timer, combineLatest } from 'rxjs';
   const timerOne$ = timer(1000, 4000);
   const timerTwo$ = timer(2000, 4000);
   const timerThree$ = timer(3000, 4000);
   combineLatest(timerOne$, timerTwo$, timerThree$).subscribe(
  ([timerValOne, timerValTwo, timerValThree]) => {

    console.log(Timer Three Latest: ${timerValThree}`
    );
  }
);


0 commentaires