(source: Signal<T>, options?: ToObservableOptions)
| 46 | * @publicApi 20.0 |
| 47 | */ |
| 48 | export function toObservable<T>(source: Signal<T>, options?: ToObservableOptions): Observable<T> { |
| 49 | if (ngDevMode && !options?.injector) { |
| 50 | assertInInjectionContext(toObservable); |
| 51 | } |
| 52 | const injector = options?.injector ?? inject(Injector); |
| 53 | const subject = new ReplaySubject<T>(1); |
| 54 | |
| 55 | const watcher = effect( |
| 56 | () => { |
| 57 | let value: T; |
| 58 | try { |
| 59 | value = source(); |
| 60 | } catch (err) { |
| 61 | untracked(() => subject.error(err)); |
| 62 | return; |
| 63 | } |
| 64 | untracked(() => subject.next(value)); |
| 65 | }, |
| 66 | {injector, manualCleanup: true}, |
| 67 | ); |
| 68 | |
| 69 | injector.get(DestroyRef).onDestroy(() => { |
| 70 | watcher.destroy(); |
| 71 | subject.complete(); |
| 72 | }); |
| 73 | |
| 74 | return subject.asObservable(); |
| 75 | } |
no test coverage detected
searching dependent graphs…