toObservable — a Signal into an Observable pipeline
Pattern
The reverse direction: a signal holds the selected id, but you want to describe loading-by-id with switchMap + retry + catchError. toObservable(mySignal) is the bridge toward an RxJS pipeline.
The problem it solves
Stay fully on signals and you'd write an effect with manual Promise cancellation. That quickly gets complex: it's easy to apply a response for an already-stale id, or forget to cancel the fetch when the signal changes.
Operators and why they matter
BehaviorSubject in the example simulates a signal — it holds the current value and emits on change.
distinctUntilChanged — don't start a load for the same id.
switchMap — a new id cancels the request for the old one. The response race is solved declaratively.
map — format the response for the UI.
Gotchas
mergeMap instead of switchMap — an old slow response overwrites the new one.
Don't call toObservable inside computed or a template — every recompute creates a new stream and new subscriptions.
Too-frequent signal changes — add debounceTime so you don't hit the network on every twitch.
What you get
The signal drives the RxJS load. The best of both worlds: synchronous state and declarative cancellation of stale requests.