it('should dispose notifier if source observable completes', () => { const e1 = hot('--a--| '); const e1subs = '^ ! '; const e2 = hot('-------x--|'); const e2subs = '^ ! '; const expected = '--a--| '; expectObservable(e1.pipe(takeUntil(e2))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); });
// ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Subscribe to config changes this._fuseConfigService.config .pipe(takeUntil(this._unsubscribeAll)) .subscribe( (config) => { this.fuseConfig = config; } ); }
it('should take all values when notifier does not complete', () => { const e1 = hot('--a--b--c--d--e--f--g--|'); const e1subs = '^ !'; const e2 = hot('-'); const e2subs = '^ !'; const expected = '--a--b--c--d--e--f--g--|'; expectObservable(e1.pipe(takeUntil(e2))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); });
asDiagram('takeUntil')('should take values until notifier emits', () => { const e1 = hot('--a--b--c--d--e--f--g--|'); const e1subs = '^ ! '; const e2 = hot('-------------z--| '); const e2subs = '^ ! '; const expected = '--a--b--c--d-| '; expectObservable(e1.pipe(takeUntil(e2))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); });
it('should raise error if source raises error before notifier emits', () => { const e1 = hot('--a--b--c--d--# '); const e1subs = '^ ! '; const e2 = hot('----------------a--|'); const e2subs = '^ ! '; const expected = '--a--b--c--d--# '; expectObservable(e1.pipe(takeUntil(e2))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); });
switchMap(() => merge( // then emit every 500ms, and when the navigation ends or cancels or errors. This delay must // match the transition duration in the .scss file timer(0, 500).pipe( map(i => 100 - (100 / Math.pow(2, i))), // emit 0 then 50, 75, 87.5, etc. takeWhile(i => i < 99.95), // stop because that just triggers change detection with no visual change anymore takeUntil(end$), // but stop emitting every 500ms when the navigation ends or cancels or errors map(i => ({ value: i })) ), end$.pipe(first(), map(() => null)) // set back to null when the navigation ends or cancels or errors to hide // the progress bar ))
it('should raise error immediately if source throws', () => { const e1 = cold( '#'); const e1subs = '(^!)'; const e2 = hot('--x'); const e2subs = '(^!)'; const expected = '#'; expectObservable(e1.pipe(takeUntil(e2))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); });
it('should complete when notifier emits before source observable emits', () => { const e1 = hot('----a--|'); const e1subs = '^ ! '; const e2 = hot('--x '); const e2subs = '^ ! '; const expected = '--| '; expectObservable(e1.pipe(takeUntil(e2))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); });
it('should not complete when source and notifier do not complete', () => { const e1 = hot('-'); const e1subs = '^'; const e2 = hot('-'); const e2subs = '^'; const expected = '-'; expectObservable(e1.pipe(takeUntil(e2))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); });
it('should not complete when notifier is empty if source observable does not complete', () => { const e1 = hot('-'); const e1subs = '^'; const e2 = hot('--|'); const e2subs = '^ !'; const expected = '---'; expectObservable(e1.pipe(takeUntil(e2))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); });