【问题标题】:NGRX Effects / Firebase (Firestore) ErrorNGRX 效果/Firebase (Firestore) 错误
【发布时间】:2018-10-29 15:20:00
【问题描述】:

我有一个带有 ngrx 和 firebase 的 angular 6 应用程序,并设置了我的商店和服务来执行基本的 crud 操作。

一切似乎都运行良好,即我可以添加、编辑、删除条目。但是我正在尝试执行一个成功的操作,但它似乎没有执行该操作,而且我不知道如何捕获错误。

效果中的以下几行似乎从未执行过,我也没有收到任何错误。

.pipe(
              map(() => new tasksActions.RemoveTaskSuccess(task)),
              catchError(error => of(new tasksActions.RemoveTaskFail(error)))
            );

我尝试调试,但代码没有返回。

效果

 @Effect()
      removeTask$ = this.actions$.ofType(tasksActions.REMOVE_TASK).pipe(
        map((action: tasksActions.RemoveTask) => action.payload),
        switchMap(task => {
          return this.fss
            .delete('tasks/' + task.id)
            .pipe(
              map(() => new tasksActions.RemoveTaskSuccess(task)),
              catchError(error => of(new tasksActions.RemoveTaskFail(error)))
            );
        })
      );

服务

delete<T>(ref: DocPredicate<T>): Observable<any> {
    return new Observable(observer => {
      this.doc(ref).delete();
    });
  }

动作

import { Action } from '@ngrx/store';
import { Board } from '../../models/task.model';

export const LOAD_TASKS = '[Tasks]: Load Tasks';
export const LOAD_TASKS_FAIL = '[Tasks]: Load Tasks Fail';
export const LOAD_TASKS_SUCCESS = '[Tasks]: Load Tasks Success';
export const CREATE_TASK = '[Tasks]: Create Task';
export const CREATE_TASK_FAIL = '[Tasks]: Create Task Fail';
export const CREATE_TASK_SUCCESS = '[Tasks]: Create Task Success';
export const UPDATE_TASK = '[Tasks] Update ';
export const UPDATE_TASK_FAIL = '[Tasks] Update  Fail';
export const UPDATE_TASK_SUCCESS = '[Tasks] Update  Success';
export const REMOVE_TASK = '[Tasks] Remove Task ';
export const REMOVE_TASK_FAIL = '[Tasks] Remove Task  Fail';
export const REMOVE_TASK_SUCCESS = '[Tasks] Remove Task  Success';

export class LoadTasks implements Action {
  readonly type = LOAD_TASKS;
}

export class LoadTasksFail implements Action {
  readonly type = LOAD_TASKS_FAIL;
  constructor(public payload: any) {}
}

export class LoadTasksSuccess implements Action {
  readonly type = LOAD_TASKS_SUCCESS;
  constructor(public payload: Board[]) {}
}

export class CreateTask implements Action {
  readonly type = CREATE_TASK;
  constructor(public payload: Board) {}
}

export class CreateTaskFail implements Action {
  readonly type = CREATE_TASK_FAIL;
  constructor(public payload: any) {}
}

export class CreateTaskSuccess implements Action {
  readonly type = CREATE_TASK_SUCCESS;
  constructor(public payload: Board) {}
}

export class UpdateTask implements Action {
  readonly type = UPDATE_TASK;
  constructor(public payload: Board) {}
}

export class UpdateTaskFail implements Action {
  readonly type = UPDATE_TASK_FAIL;
  constructor(public payload: any) {}
}

export class UpdateTaskSuccess implements Action {
  readonly type = UPDATE_TASK_SUCCESS;
  constructor(public payload: Board) {}
}

export class RemoveTask implements Action {
  readonly type = REMOVE_TASK;
  constructor(public payload: Board) {}
}

export class RemoveTaskFail implements Action {
  readonly type = REMOVE_TASK_FAIL;
  constructor(public payload: any) {}
}

export class RemoveTaskSuccess implements Action {
  readonly type = REMOVE_TASK_SUCCESS;
  constructor(public payload: Board) {}
}

export type TasksAction =
  | LoadTasks
  | LoadTasksFail
  | LoadTasksSuccess
  | CreateTask
  | CreateTaskFail
  | CreateTaskSuccess
  | UpdateTask
  | UpdateTaskFail
  | UpdateTaskSuccess
  | RemoveTask
  | RemoveTaskFail
  | RemoveTaskSuccess;

减速器

import * as fromTasks from '../actions/tasks.actions';
import { Board } from '../../models/task.model';
// import { reducers } from '../../../../../../store/reducers/index';

export interface TaskState {
  entities: { [id: string]: Board };
  loaded: boolean;
  loading: boolean;
}

export const initialState: TaskState = {
  entities: {},
  loaded: false,
  loading: false
};

export function reducer(state = initialState, action: fromTasks.TasksAction): TaskState {
  switch (action.type) {
    case fromTasks.LOAD_TASKS: {
      return {
        ...state,
        loading: true
      };
    }

    case fromTasks.LOAD_TASKS_FAIL: {
      return {
        ...state,
        loading: false,
        loaded: false
      };
    }

    case fromTasks.LOAD_TASKS_SUCCESS: {
      const tasks = action.payload;
      const entities = tasks.reduce(
        // tslint:disable-next-line:no-shadowed-variable
        (entities: { [id: string]: Board }, task: Board) => {
          return {
            ...entities,
            [task.id]: task
          };
        },
        {
          ...state.entities
        }
      );
      return {
        ...state,
        loading: false,
        loaded: true,
        entities
      };
    }

    // If update or create
    case fromTasks.UPDATE_TASK_SUCCESS:
    case fromTasks.CREATE_TASK_SUCCESS: {
      const task = action.payload;
      const entities = {
        ...state.entities,
        [task.id]: task
      };

      return {
        ...state,
        entities
      };
    }

    case fromTasks.REMOVE_TASK_SUCCESS: {
      const task = action.payload;
      const { [task.id]: removed, ...entities } = state.entities;

      return {
        ...state,
        entities
      };
    }
  }
  return state;
}

export const getTasksEntities = (state: TaskState) => state.entities;
export const getTasksLoading = (state: TaskState) => state.loading;
export const getTasksLoaded = (state: TaskState) => state.loaded;

【问题讨论】:

    标签: angular firebase rxjs google-cloud-firestore ngrx


    【解决方案1】:

    您需要捕获服务部分的错误,映射结果并捕获外部 observable 的错误。 Firestore 删除返回一个 Promise,将其转换为一个 observable 并捕获错误:

    delete<T>(ref: DocPredicate<T>): Observable<any> {
        // RxJS v5 'fromPromise' is changed to 'from'
        return from(this.doc(ref).delete()).pipe(
            catchError(error => throwError(error))
        )
    )
    

    【讨论】:

    • 是的,这就是我的问题,当我按照自己的方式或修改后的 catchError 时,我似乎无法得到错误,我得到的只是消息:“错误未定义”堆栈:“ReferenceError:错误在 eval 处未定义↵(在 (localhost:4200/tasks-tasks-module.js:1802:230), :1:1)↵ 在 SwitchMapSubscriber.project (localhost:4200/tasks-tasks-module.js:1802:230)↵ 在 pSubscriber._next (localhost:4200/vendor.js:341615:27)↵ 在 SwitchMapSubscriber。 push../node_modules/rxjs/_esm5/internal/SubscrSwitchMapSubscriber.push../node_modules/
    • this.doc(ref).delete() 是否返回一个 Promise?将其转换为 observable,我已经更新了语法。
    • 你是明星 - 非常感谢。这很好用
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2019-01-17
    • 1970-01-01
    • 2018-01-11
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多