fromEvent / fromEventPattern - удаление не происходит при отписке, если его канал имеет startWith - PullRequest
1 голос
/ 03 мая 2019

Я использовал fromEvent, но переключился на fromEventPattern, чтобы я мог console.log для устранения неполадок. Я вижу, что когда я unsubscribe(), вызывается только первый fromEventPattern метод удаления. Кто-нибудь знает, почему не вызываются обработчики удаления window.remveEventListener('online') и offline?

Если я удаляю startWith(window.navigator.onLine) из .pipe, это работает, но мне нужен startWith(window.navigator.onLine) хотя бы для одного из них.

Вот мой конвейер:

pipeline$ = combineLatest(
    merge(
        fromEventPattern(
            handler => {
                console.log('adding io.socket.disconnect');
                io.socket.on('disconnect', handler);
            },
            handler => {
                console.log('removing io.socket.disconnect');
                io.socket.off('disconnect', handler);
            },
        ).pipe(
            mapTo(false),
            tap(() => this.setState({ isConnected: false })),
        ),
        this.isConnectedSubject.pipe(
            tap(isConnected => this.setState({ isConnected })),
            startWith(io.socket.isConnected())
        )
    ),
    merge(
        fromEventPattern(
            handler => {
                console.log('adding window.online');
                window.addEventListener('online', handler, false);
            },
            handler => {
                console.log('removing window.online');
                window.removeEventListener('online', handler, false);
            }
        ).pipe(
            tap(() => console.log('online')),
            mapTo(true),
            tap(() => this.setState({ isOnline: true })),
            startWith(window.navigator.onLine)
        ),
        fromEventPattern(
            handler => {
                console.log('adding window.offline');
                window.addEventListener('offline', handler, false);
            },
            handler => {
                console.log('removing window.offline');
                window.removeEventListener('offline', handler, false);
            }
        ).pipe(
            tap(() => console.log('offline')),
            mapTo(false),
            tap(() => this.setState({ isOnline: false })),
            startWith(window.navigator.onLine)
        )
    )
).pipe(
    switchMap(([ isConnected, isOnline, ...rest ]) => {
        console.log('isConnected:', isConnected, 'isOnline:', isOnline, 'rest:', rest);
        console.log(!isConnected && isOnline ? 'RE-CON now' : 'DO NOT re-con');
        return !isConnected && isOnline
            ? defer(() => connectSocket()).pipe(
                retryWhen(error$ =>
                    error$.pipe(
                        tap(error => console.log('got socket connect error!', error.message)),
                        delayWhen((_, i) => {
                            const retryIn = 10000;
                            this.setState({
                                retryAt: Date.now() + retryIn
                            });
                            return timer(retryIn);
                        })
                    )
                ),
                tap(() => isConnectedSubject.next(true))
            )
            : EMPTY;
    }),
    takeUntil(mSessionSubject.pipe(
        filter(action => action.type === 'LOGOUT'),
    ))
);

Я подписываюсь на это так:

const sub = pipeline$.subscribe();

и тогда я отписываюсь вот так:

sub.unsubscribe();

После вызова этой отписки я не вижу триггера методов удаления online / offline.

1 Ответ

0 голосов
/ 03 мая 2019

проверяли ли вы подписку перед тем как отписаться? что-то вроде

if (sub !== undefined) {
  sub.unsubscribe();
}

потому что вы можете отменить подписку до того, как sub отправит какие-либо данные, однако Не рекомендуется использовать отписку , но вы можете использовать take(n), takeWhile(predicate), first() или first(predicate) вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...