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.
3 Réponses :
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);
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
Vous pouvez utiliser juste Peu importe si ignorelements () code>.
obs1 code> émet un
Next < / code> notifications ou non.
obs1 code> doit juste fonctionner. p> p>
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
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}` ); } );