VJAI
VJAI

Reputation: 32758

Executing two observables sequentially and wait for both to complete

I want the done to print only after the first and second is printed.

const obs1 = new Observable<any>((observer) => {
  setTimeout(() => {
    console.log('first');
    observer.next();
    observer.complete();
  }, 10000);
});

const obs2 = new Observable<any>((observer) => {
  setTimeout(() => {
    console.log('second');
    observer.next();
    observer.complete();
  }, 1000);
});

from([obs1, obs2]).pipe(concatAll()).subscribe(() => {
  console.log('done');
});

Upvotes: 0

Views: 79

Answers (1)

martin
martin

Reputation: 96891

You don't complete any of the two source Observables so no operator can know what you consider as "done". This means you could use merge or combineLatest and only handle next notifications.

However, if you know they'll always emit just once you can complete each source and then use forkJoin or concat:

const obs1 = new Observable<any>((observer) => {
  setTimeout(() => {
    console.log('first');
    observer.next();
    observer.complete();
  }, 10000);
});

...

concat(obs1, obs2).subscribe({
  complete: () => {
    console.log('done');
  }
});

Upvotes: 1

Related Questions