I am trying to understand behavior of concatMap() operator. I wrote some [example code](https://stackblitz.com/edit/rxjs-zggqxc?file=index.ts)

```
import './style.css';

import { concatMap, fromEvent, tap } from 'rxjs';
import { first } from 'rxjs/operators';

const button1 = document.getElementById('button1');
const button2 = document.getElementById('button2');
const button3 = document.getElementById('button3');
const obs1 = fromEvent(button1, 'click');
const obs2 = fromEvent(button2, 'click');
const obs3 = fromEvent(button3, 'click');

obs1
  .pipe(
    concatMap((obs1value) => {
      console.log('obs1:', obs1value);
      return obs2; // wait for this to complete before merging next value
    }),
    concatMap((obs2value) => {
      console.log('obs2', obs2value);
      return obs3; // wait for this to complete before merging next value
    })
  )
  .subscribe((obs3value) => {
    console.log('obs3:', obs3value);
  });

// button2.click() // nothing
// button3.click() // nothing

button1.click(); // obs1
button2.click(); // obs2
button3.click(); // obs3

button1.click(); // nothing -???
button2.click(); // nothing -???

button3.click(); // obs3
button3.click(); // obs3
button3.click(); // obs3

```

Initially after button 1, button 2 and button 3 are clicked, I can see the print statements. However after that for button1 and button2, there are no print statements, it is observed only in case of button3. I see RxJS documentation says concatMap() would be "...waiting for each one to complete before merging the next". But since obs1, obs2 and obs3 have not completed yet, why do I see the print statement even once?

If I change the code slightly <https://stackblitz.com/edit/rxjs-zggqxc>, to complete observable as below

```
obs3.pipe(first());

```

Now licking button1, why is nothing is printed?

```
button1.click(); // obs1
button2.click(); // obs2
button3.click(); // obs3

button1.click(); // nothing -???
button2.click(); // obs2
button3.click(); // obs3
button3.click(); // nothing
button3.click(); // nothing
button2.click(); // obs2

```