【问题标题】:redux-observable: Actions must be plain objects. Use custom middleware for async actionsredux-observable:动作必须是普通对象。使用自定义中间件进行异步操作
【发布时间】:2017-05-31 10:17:58
【问题描述】:

我的史诗有问题,请帮我找出哪里出错了。谢谢!

以下代码导致我出现错误:

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;
  }
};

【问题讨论】:

    标签: reactjs redux redux-observable


    【解决方案1】:

    我相信您必须从 map()编辑 - 感谢 paulpdaniels: 但不是 catch())方法中删除 Observable.of(...),因为这样您将返回一个 observable observables - 请参阅下面的简化代码:

    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,
              });
            });
        });
    

    【讨论】:

    • 你过头了,可以从map 中删除,但catch 需要Observable 返回。
    • @paulpdaniels 是的,完全正确,感谢您的指正!
    • 哦,我没认出来。谢谢;)
    • @paulpdaniels 是的,在我的情况下,我将其修复为:.catch((err: any,catch: Observable) => { return Observable.of({ payload: err, type : types.loginFailed, }); }));
    • 不适合我。我仍然遇到同样的错误
    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 2018-11-12
    • 2018-01-31
    • 2018-03-27
    • 1970-01-01
    • 2018-01-30
    • 2017-05-01
    相关资源
    最近更新 更多