代码之家  ›  专栏  ›  技术社区  ›  Dávid Lévai

错误:动作必须是普通对象。使用自定义中间件进行异步操作。在React Native中

  •  1
  • Dávid Lévai  · 技术社区  · 8 年前

    每次尝试调度操作时,我都会出现以下错误:

    行动。

    我已经安装了 redux-thunk

    存储配置:

    import { applyMiddleware, createStore } from 'redux';
    import thunk from 'redux-thunk';
    import { createLogger } from 'redux-logger';
    import { composeWithDevTools } from 'redux-devtools-extension';
    
    import reducers from '../reducers/index';
    
    const logger = createLogger();
    
    export default createStore(reducers, composeWithDevTools(applyMiddleware(thunk)));
    

    用户界面:

    ...
    import { connect } from 'react-redux';
    import { getCities } from '../../actions/cities';
    ...
    componentDidMount = async () => {
        try {
          const cities = await this.props.getCities();
          console.log(cities);
        } catch (error) {
          console.log(`errorhome: ${error}`);
        }
        SplashScreen.hide();
      }
    ...
    
    const mapDispatchToProps = dispatch => ({
      changeNetworkStatus: () => dispatch(changeNetworkStatus),
      getCities: () => dispatch(getCities),
    });
    
    export default connect(mapStateToProps, mapDispatchToProps)(Home);
    

    行动:

    import database from '../config/utils';
    
    export const GET_CITIES_START = 'GET_CITIES_START';
    export const GET_CITIES_FINISHED = 'GET_CITIES_FINISHED';
    export const GET_CITIES_ERROR = 'GET_CITIES_ERROR';
    
    const getCititesStart = () => ({ type: GET_CITIES_START });
    const getCititesFinished = cities => ({ type: GET_CITIES_FINISHED, cities });
    const getCititesError = error => ({ type: GET_CITIES_ERROR, error });
    
    export const getCitites = () => async (dispatch) => {
      dispatch(getCititesStart());
      try {
        const cities = [];
        const snap = await database.ref('cities').once('value');
        console.log('snap: ', snap);
        snap.forEach((element) => {
          const city = {
            city: element.key,
            coordinate: element.val().coordinate,
          };
          cities.push(city);
        });
        dispatch(getCititesFinished(cities));
      } catch (error) {
        dispatch(getCititesError(error));
      }
    };
    

    logger 对于中间件,错误消息如下:

    TypeError:无法读取未定义的属性“type”

    1 回复  |  直到 8 年前
        1
  •  1
  •   Jan Cássio    8 年前

    动作是返回包含动作数据的对象的函数,该数据是包含 type 所有物

    您正在调度这样的操作:

    dispatch(getCities)
    

    您应该采取以下行动:

    dispatch(getCities())