TypeError:action $ .ofType(...)。mergeMap不是一个函数

时间:2018-10-01 08:01:04

标签: reactjs react-redux redux-thunk redux-observable

我是ReactJS的新手,正在尝试将redux与现有项目集成。

这是我存储中的 index.js 文件

import 'rxjs'
import { createStore, combineReducers, applyMiddleware } from 'redux'
import { reducer as formReducer } from 'redux-form'
import thunk from 'redux-thunk'
import promise from 'redux-promise-middleware'
import { createEpicMiddleware, combineEpics } from 'redux-observable'

import user, { userEpic } from './user/duck'
import app from './app'

// Bundling Epics
const rootEpic = combineEpics(
    userEpic
)

// Creating Bundled Epic
const epicMiddleware = createEpicMiddleware(rootEpic)

// Define Middleware
const middleware = [
  thunk,
  promise(),
  epicMiddleware
]

// Define Reducers
const reducers = combineReducers({
  app,
  user,
  form: formReducer
})

// Create Store
export default createStore(reducers,window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(), applyMiddleware(...middleware))

这是 duck.js

const createUserEpic = (action$) =>
  action$
  .ofType(SIGNUP_CONCIERGE)
  .mergeMap((action) => {
    return Rx.Observable.fromPromise(api.signUpConcierge(action.payload))
    .flatMap((payload) => ([{
      type: SIGNUP_CONCIERGE_SUCCESS,
      payload
    }]))
    .catch((error) => Rx.Observable.of({
      type: SIGNUP_CONCIERGE_ERROR,
      payload: { error }
    }))
  })

export const userEpic = combineEpics(
  createUserEpic
)

这会向我抛出错误TypeError: action$.ofType(...).mergeMap is not a function

自从我更新了react,react-redux,redux-observable版本以来,我一直收到此错误。

我在这里做错了什么?请帮忙!!!

2 个答案:

答案 0 :(得分:4)

尝试一下:

首先,将这些功能导入文件的顶部

import { mergeMap } from 'rxjs/operators';
import { ofType } from 'redux-observable';

然后,像这样修复代码(注意ofType()mergeMap()comma而不是dot分隔):

const createUserEpic = action$ =>
  action$.pipe(  //fixed
    ofType(SIGNUP_CONCIERGE),
    mergeMap(action => {
      return Rx.Observable.fromPromise(api.signUpConcierge(action.payload))
        .flatMap(payload => [
          {
            type: SIGNUP_CONCIERGE_SUCCESS,
            payload
          }
        ])
        .catch(error =>
          Rx.Observable.of({
            type: SIGNUP_CONCIERGE_ERROR,
            payload: { error }
          })
        );
    })
  );

export const userEpic = combineEpics(createUserEpic);

您忘记了pipe()方法,还从适当的软件包中导入了ofTypemergeMap方法。

导入这些方法后,要使用它们,首先需要使用pipe()方法,如下所示:

 action$.pipe();

之后,您将可以使用ofType()mergeMap()方法:

 action$.pipe(
     ofType(),
     mergeMap()
 );

请注意,它们之间用comma隔开,而不是dot

答案 1 :(得分:2)

根据this github issue,每个rxjs运算符在使用前都应包括在内。

人们建议您是否import rxjsindex.js文件(不是store/index.js,而是项目条目文件)上。

或者您可以在import rxjs/add/operator/mergeMap中进行duck.js

这两种方法都有效,由您决定选择哪种方式。