1. Compare forkJoin, combineLatest, withLatestFrom, and zip.
forkJoin waits for all observables to complete and emits one array (use for multi-HTTP fetch). combineLatest emits whenever any source emits, using the latest values of each (live combination). withLatestFrom samples another stream’s latest value when the source emits. zip pairs emissions by index and emits tuples.
forkJoin({ user: this.api.user(id), posts: this.api.posts(id) })
.subscribe(({user, posts}) => { this.user = user; this.posts = posts; });