Выдает эффект ngrx «отправлено недопустимое действие: undefined» - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть этот эффект для подтверждения выхода из системы при условии ответа диалога, но я получаю следующие ошибки:

Ошибка ОШИБКИ: эффект "AuthEffects.logoutConfirmation $" отправил недопустимое действие: undefined

и

ОШИБКА TypeError: Действия должны быть объектами

Вот эффект:

@Effect()
logoutConfirmation$ = this.actions$
    .ofType<Logout>(AuthActionTypes.Logout)
    .pipe(
      map(action => {
        if (action.confirmationDialog) {
          this.dialogService
            .open(LogoutPromptComponent)
            .afterClosed()
            .pipe(
              map(confirmed => {
                if (confirmed) {
                  return new LogoutConfirmed();
                } else {
                  return new LogoutCancelled();
                }
              })
            );
        } else {
          return new LogoutConfirmed();
        }
      })
    );

это работаеткогда диалог подтверждения активирован, я думаю, что-то не так с картой ответа диалога, я пытался понять это, но не смог найти способ.Кто-нибудь имеет ключ к этому?

1 Ответ

0 голосов
/ 23 ноября 2018

Ваша внешняя карта должна быть mergeMap, поскольку вы отображаете действие в новый поток (в случае, если условие выполняется).

Это можно исправить следующим образом:

import { of } from 'rxjs';
import {map, mergeMap } from 'rxjs/operators';

@Effect()
logoutConfirmation$: Observable<Action> = this.actions$
    .ofType<Logout>(AuthActionTypes.Logout)
    .pipe(
      mergeMap(action => {
        if (action.confirmationDialog) {
          return this.dialogService
            .open(LogoutPromptComponent)
            .afterClosed()
            .pipe(
              map(confirmed => confirmed ? new LogoutConfirmed():new LogoutCancelled())
            );
        } else {
          return of(new LogoutConfirmed());
        }
      })
    );

В качестве примечания всегда объявляйте явный тип ваших эффектов, чтобы получать ошибки при компиляции, а не во время выполнения.

...