2

I have two observables (obs1 and obs2) that I want to pay attention to. They never complete and over their lifetime I can expect that they emit the same number of items. I cannot know which one will emit first. I need something that will emit every time the source observables have each emitted their nth item. So, I am looking for an observable that acts in either of these ways:

  • (a) It emits every time the source observables have each emitted the same number of items.
  • (b) It emits every time the source observable, that has currently emitted the least amount of items, makes an emission.

Example for a:

If obs1 emits its 1st item and then obs2 emits its 1st item, myObservable will produce its 1st emission. Then if obs2 emits a 2nd and 3rd item nothing will happen until obs1 emits its 2nd item and only then will myObservable produce its 2nd emission.

(a) When source observables have the same number of items emitted.

(b) Whenever, across all the source observables, the lowest number of items emitted increases.

Jonathan C
  • 23
  • 5
  • This really sounds like an [`XY question`](https://meta.stackexchange.com/a/66378) – Adam Jenkins Sep 16 '21 at 00:32
  • It probably is an XY question to some degree. I have been searching for this kind of solution for a while since I often find problems that I think would be solved by this kind of observable. I have glances at zip, but did not understand this is how it worked, so I am grateful for all the answerers. – Jonathan C Sep 16 '21 at 20:26
  • Please provide enough code so others can better understand or reproduce the problem. – Community Sep 22 '21 at 15:33

2 Answers2

2

RxJS#zip

Zip does extactly what you're after.

For example, consider these two intervals that emit 5 times each but at different rates:

zip(
  interval(1000).pipe(map(v => v + 10) , take(5)), 
  interval(1500).pipe(map(v => v + 100), take(5))
).subscribe(console.log);
Mrk Sef
  • 7,557
  • 1
  • 9
  • 21