Функция для обобщения эффектов NGRX - PullRequest
0 голосов
/ 15 марта 2019

У меня есть следующий код эффекта:

@Effect() public setupFirstAccess$ = this.actions$
    .ofType<usersActions.SetupUserAccessAction>(usersActions.SETUP_USER_ACCESS).pipe(
        switchMap(action => this.usersService.setupUserAccess(action.payload)
            .pipe(
                map(() => new usersActions.SetupUserAccessSuccessAction()),
                catchError(error =>
                    {
                        return of(new applicationActions.ShowHttpResponseError(
                            {
                                error: error,
                                nextAction: new usersActions.SetupUserAccessFailureAction()
                            }
                        ));
                    }
                )
            )
        ));

Я использую эту структуру эффектов в ОДНОМ эффекте, поэтому я пытаюсь добавить такую ​​функцию:

protected createSimpleEffect<T>(data: {
    type: string,
    dataFetchFunction: (action: Action) => Observable<T>,
    successFunction: (result: any, action:  Action) => void,
    failureFunction: (action:  Action) =>  Action
}): Observable<any>
{
    return this.actions$
        .ofType(data.type).pipe(
            switchMap(action => data.dataFetchFunction(action)
                .pipe(
                    map((result: any) => data.successFunction(result, action),
                    catchError(error =>
                        {
                            return of(new applicationActions.ShowHttpResponseError(
                                {
                                    error: error,
                                    nextAction: data.failureFunction(action)
                                }
                            ));
                        }
                    )
                )
            ))
        );
}

И я называю это так:

@Effect() public setupUserAccess$ = this.createSimpleEffect<void>({
    type: usersActions.SETUP_USER_ACCESS,
    dataFetchFunction: (action: usersActions.SetupUserAccessAction) => this.usersService.setupUserAccess(action.payload),
    successFunction: (result, action) => new usersActions.SetupUserAccessSuccessAction(),
    failureFunction: (action) => new usersActions.SetupUserAccessFailureAction()
});

Исходный код работает, эффект запускает службу пользователя, затем вызывает действие success, и если я получаю ошибку по запросу, он вызывает оператор catchError.

Альтернативная версия работает до того момента, когда она запускает службу пользователя, но когда я получаю ошибку на бэкэнде, она не выполняет код в операторе catchError.

Я что-нибудь связал с наблюдаемыми при рефакторинге кода функции?

...