Как сбросить эффекты ngrx при выходе? NGRX Эффекты - PullRequest
0 голосов
/ 28 апреля 2020

Подскажите пожалуйста, как сбросить все эффекты на какое-то действие (выход пользователя)? Я хотел бы сбросить все эффекты на действиях LOG_OUT. Например:

  1. подписать некоторый эффект на какое-либо действие
  2. триггер takeUntil() внутренний эффект
  3. выход из системы
  4. сброс всех эффектов
  5. снова подписать тот же эффект на то же действие (с шага 1).

в данный момент шаг 5 не работает, поэтому takeUntil() отмените этот эффект.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я добавил mergeMap и положил туда takeUntil. Теперь это хорошо.

 @Effect() createConversation$ = this.actions$.pipe(
    ofType(CREATE_CONVERSATION),
    map((action: CreateConversation) => action.payload),
    withLatestFrom(this.store.pipe(select(selectConversation))),
    mergeMap(([message, mdConversation]) => {
      return this.httpService
        .createConversation(mdConversation.data.taskId, message)
        .pipe(
          map(
            result =>
              new CreateConversationComplete({
                id: result.data.id,
                tmpId: mdConversation.data.id
              })
          ),
          catchError((error: MyError) => {
            if (error.type === MyerrorTypes.NETWORK) {
              return of(new CreateConversationRetry(message));
            }
            if (error.type === MyerrorTypes.APPLICATION) {
              return of(new CreateConversationError(mdConversation.data));
            }
          }),
          takeUntil(this.actions$.pipe(ofType(LOG_OUT)))
        );
    })
  );


@Effect() createConversationRetry$ = this.actions$.pipe(
        ofType(CREATE_CONVERSATION_RETRY),
        mergeMap((action: CustomAction) =>
          of(action).pipe(
            delay(NETWORK_TIMEOUT),
            map(data => new CreateConversation(action.payload)),
            takeUntil(this.actions$.pipe(ofType(LOG_OUT)))
          )
        )
      );
0 голосов
/ 28 апреля 2020

Проблема в том, что takeUntil завершает наблюдаемое: https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/takeUntil.ts#L85, и вы не можете снова подписаться. Если вам нужно приостановить эффект после выхода из системы, я бы использовал фильтрацию:

withLatestFrom(..is logged in selector)
filter((isLoggedIn: boolean) => isLoggedIn)
...