Угловой 6 + @angular-redux/store. Правильный способ реализации избыточного толка

Я использую @angular-redux/store а также redux-thunk в моем угловом приложении 6, и у меня возникают проблемы с их настройкой.

Я не хотел бы использовать redux-observable потому что обычно в react Я могу добиться того же с redux-thunk только без добавления новой сущности (epics, представлен redux-observable) в шаблоне дизайна редукса.

Вот как я настроил магазин:

constructor(
        public store: NgRedux<StoreModel>,
        devTools: DevToolsExtension,
        ngReduxRouter: NgReduxRouter
    ) {
        store.configureStore(
            StoreReducer,
            {},
            [thunk],
            devTools.isEnabled()
                ? [devTools.enhancer(), applyMiddleware(thunk)]
                : [applyMiddleware(thunk)]
        );

        // Enable syncing of Angular router state with our Redux store.
        if (ngReduxRouter) {
            ngReduxRouter.initialize();
        }

        // Enable syncing of Angular form state with our Redux store.
        provideReduxForms(store);
    }

Это мои два действия:

@dispatch()
public fetchUsersThunk() {
    return of([new User('test user 1')]).pipe(
        map((users: User[]) => this.fetchUsersFulfilled(users))
    );
}

@dispatch()
public fetchUsersFulfilled(users: User[]): UserAction {
    return {
        type: UserActions.FETCH_USERS,
        users
    };
}

Так что со стороны я могу назвать свое действие fetchUsersThunk который должен делать все вещи и обновлять состояние.

Я получаю следующую ошибку:

AppComponent_Host.ngfactory.js? [см]:1 ОШИБКА Ошибка: Действия должны быть простыми объектами. Используйте пользовательское промежуточное ПО для асинхронных действий.

Словно applyMiddleware(thunk) не работает.

Я использовал одну и ту же модель множество раз с react и все работает отлично. Любая идея вопроса здесь с @angular-redux/store? Я плохо использую configureStore метод? или dispatch() декоратор?

1 ответ

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

Магазин:

store.configureStore(
            StoreReducer,
            {},
            [thunk], // plain middleware thunk as middlewares
            devTools.isEnabled() ? [devTools.enhancer()] : []
        );

Действия:

public dispatchFetchUsersThunk() {
    return this.fetchUsersThunk()(this.ngRedux.dispatch);
}

@dispatch()
public fetchUsersThunk() {
    return (disp: any) => {
        return of([new User('test user 1'), new User('test user 2')])
            .pipe(map(val => disp(this.fetchUsersFulfilled(val))))
            .pipe(
                tap(val => {
                    console.log('tapping'); // second output
                })
            );
    };
}

public fetchUsersFulfilled(users: User[]): UserAction {
    console.log('fetch users fulfilled'); // first output
    return {
        type: UserActions.FETCH_USERS,
        users
    };
}

Вот основное действие для вызова:

this.actions.dispatchFetchUsersThunk().subscribe(val => {
            console.log('main subscription'); // last output
        });

Мне нужно дополнительное действие dispatchFetchUsersThunk который не является dispatch() декоратор, потому что я хочу вернуть наблюдаемую информацию, чтобы знать, когда будут выполнены все внутренние отправки, откуда я буду вызывать действие (как вы можете видеть на консоли выше и в комментариях, порядок, кажется, соблюдается)

Другие вопросы по тегам