When to use? : You have 2 queries or more. You need to do something depending on of the results of those queries. For example, you need to wait for page params and get the connected user information...
CombineLatest emits an item whenever any of the source Observables emits an item (so long as each of the source Observables has emitted at least one item)
So you have 2 or more async observables, the Observable.combineLatest is called after each emitted their first value, and give the opportunity to a function to remit a item with the value of the last emitted item
When to use? Combine 2 sources with the latest emitted version for the second source. withLatestFrom is generally followed by a map where the 2 sources results .map([source1, source2) => { //handle 2 sources } can be manipulated
this.actions$.ofType(Auth.LOGIN)
.map((action: Auth.Login) => action.payload)
.withLatestFrom(this.geolocationService.refreshLocation())
// auth and geo are mapped to inner observable (sub-observable)
// if new values are emitted but inner observable are not completed
// they won't be mapped again
.exhaustMap(([auth, geo]) => this.authService.login(auth, geo)
.map(loginAuth => new Auth.LoginSuccess({ auth: loginAuth }))
.catch(error => of(new Auth.LoginFailure(error)))
);