Почему не работает угловой эффект ngx, если он один раз провалился? - PullRequest
0 голосов
/ 04 октября 2019

Я использую угловые эффекты 6 и Ngrx. его эффект входа в систему

@Effect({dispatch: false})
login$ = this.actions$.pipe(
    ofType<Login>(AuthActionTypes.Login),
    tap(action => {
        localStorage.setItem(environment.authTokenKey, action.payload.authToken);
        console.log('login effect');
        this.store.dispatch(new UserRequested());
    }),
);

он отправил пользовательский эффект запроса

@Effect({dispatch: false})
loadUser$ = this.actions$
.pipe(
    ofType<UserRequested>(AuthActionTypes.UserRequested),
    withLatestFrom(this.store.pipe(select(isUserLoaded))),
    filter(([action, _isUserLoaded]) => !_isUserLoaded),
    mergeMap(([action, _isUserLoaded]) => this.auth.getUserByToken()),
    tap(data => {
        console.log('login effect');
        if (data) {
            this.store.dispatch(new UserLoaded({ user: data['user'] }));
            localStorage.setItem('options', JSON.stringify(data['options']));
            // localStorage.setItem("permissions", data['user'].permissions_list);
            data['user'].permissions_list.forEach((item) => {
                this.permissionsService.addPermission(item.name);
            });
        } else {
            this.store.dispatch(new Logout());
        }
    }, error => {
        this.store.dispatch(new Logout());
    })
  );

Если этот эффект был вызван и НЕ ПРОЙДЛ В МЕНЬШЕ ОДИН РАЗ , прежде чем он не будетпозвонил снова. Почему?

1 Ответ

0 голосов
/ 04 октября 2019

Потому что потоки должны контролироваться. Если в потоке есть ошибка, она останавливается, как и предполагалось.

Если вы не хотите останавливаться, рассмотрите возможность использования оператора catchError вместе с функцией throwError или просто перехватите ошибку в вашей подписке.

Посмотреть вживую:

не работает

rxjs.throwError('mocked error')
  .subscribe(
    () => console.log('You should not see this message'),
  )
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.js"></script>

рабочий

rxjs.throwError('mocked error')
  .subscribe(
    () => console.log('You should not see this message'),
    () => console.log('You should see this message')
  )
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.js"></script>

рабочий BIS

rxjs.throwError('mocked error')
  .pipe(rxjs.operators.catchError(err => rxjs.of('some mocked replacement value')))
  .subscribe(
    () => console.log('You should see this message'),
    () => console.log('You should not see this message')
  )
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...