redux-observable: действия должны быть простыми объектами. Используйте собственное промежуточное ПО для асинхронных действий

У меня проблема с моим эпиком, пожалуйста, помогите мне понять, где я ошибся. Благодарю вас!

Следующий код приводит меня к ошибке:

const loginEpic = (action$) =>
  action$
    .ofType('LOGIN')
    .switchMap(() => {
      return Observable.fromPromise(loginService())
        .map((result) => {
          return Observable.of({
            payload: result,
            type: types.loginCompleted,
          });
        })
        .catch((error) => {
          return Observable.of({
            payload: error,
            type: types.loginFailed,
          });
        });
    });

А вот мой файл configureStore:

const epicMiddleware = createEpicMiddleware(rootEpic);

// Ref: https://redux-observable.js.org/docs/recipes/HotModuleReplacement.html
if (module.hot) {
  module.hot.accept('./epic', () => {
    const nextEpic = require('./epic');
    epicMiddleware.replaceEpic(nextEpic);
  });
}

const configureStore = (): Store<any> => {

  const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(epicMiddleware)));
  if (module.hot) {
    module.hot.accept('./reducer', () => {
      const nextReducer = require('./reducer').default;
      store.replaceReducer(nextReducer);
    });

    return store;
  }
};


person hxuanhung    schedule 31.05.2017    source источник


Ответы (1)


Я считаю, что вы должны удалить Observable.of(...) из метода map() (EDIT - спасибо paulpdaniels:, но не catch()), потому что таким образом вы возвращаете наблюдаемое из наблюдаемых - см. упрощенный код ниже:

Observable.fromPromise(...)
    .map(result => Observable.of(...))  // maps an object to an observable

Весь код должен быть:

const loginEpic = (action$) =>
  action$
    .ofType('LOGIN')
    .switchMap(() => {
      return Observable.fromPromise(loginService())
        .map((result) => {
          return {
            payload: result,
            type: types.loginCompleted,
          };
        })
        .catch((error) => {
          return Observable.of({
            payload: error,
            type: types.loginFailed,
          });
        });
    });
person Nikos Paraskevopoulos    schedule 31.05.2017
comment
Вы промахнулись, правильно удалить из map, но catch требует возврата Observable. - person paulpdaniels; 31.05.2017
comment
@paulpdaniels Да, абсолютно верно, спасибо за исправление! - person Nikos Paraskevopoulos; 31.05.2017
comment
О, я не узнал его. Спасибо ;) - person hxuanhung; 01.06.2017
comment
@paulpdaniels да, в моем случае я исправил это так: })); - person hxuanhung; 01.06.2017
comment
не работает для меня. Я все еще получаю ту же ошибку - person Kasra; 22.06.2020