如何修复 redux/redux thunk 抛出的“Uncaught TypeError: callback is not a function”?

Posted

技术标签:

【中文标题】如何修复 redux/redux thunk 抛出的“Uncaught TypeError: callback is not a function”?【英文标题】:How to fix “Uncaught TypeError: callback is not a function” thrown by redux/redux thunk? 【发布时间】:2019-12-02 02:44:09 【问题描述】:

我在我的 redux 操作中进行异步调用,当我调度成功的调用时,开发工具中返回以下错误:

Uncaught TypeError: callback is not a function

当我注释掉调度调用时,应用程序当然会挂起,但我没有收到上述错误。所以这告诉我,我的 redux 操作可能存在缺陷。

然后错误中的其他行指向 react-native npm 包中的行。我目前正在 react-native 0.59.6 上运行。也许我正在运行的版本在这里有戏。

location.tsx

const getLocationSuccess = (data: any) => 
  return 
    type: GET_GEOLOCATION_SUCCESS,
    data
  


export const getLocation = (cb: Function) => 

  return (dispatch: Function, getState: Function) => 

    const  locationState  = getState();
    const  latitude, longitude  = locationState.region;
    axios.get(`https://maps.googleapis.com/maps/api/geocode/json?latlng=$latitude,$longitude&key=<API KEY>`)
    .then(json => 

      const address = json.data.results[0].formatted_address;

      const data = 
        loading: false,
        currentLocation: address
      ;

      // THIS LINE IS CAUSING THE ERROR
      dispatch(getLocationSuccess(data));
      cb(true)

    )
    .catch((err: any) => 
      console.log('NAVIGATOR FAILED: ', err)
    )
  

index.tsx

componentDidMount()

  this.props.actions.getLocation(() => 
      console.log('LOCATION SUCCESS')
   );
 ;

【问题讨论】:

【参考方案1】:

在函数名称 getlocationSuccess 中,字母 L 很小。但是,打电话时是资本。

【讨论】:

不知道为什么。我的代码中它是正确的,但这并没有导致上面的错误。不过很好。【参考方案2】:

我解决了这个问题。问题不在任何 redux 文件中。这是 React 的版本问题。我没有在最新版本的 React 上运行,因此,React 没有明确安装正确版本的“调度程序包 0.14.0”(这是错误消息所指向的)。

修复,您可以安装正确的调度程序包,也可以升级到最新版本的 React。

他们在这个问题中提到了关于钩子的内容: https://github.com/facebook/react/issues/15647

【讨论】:

【参考方案3】:

getLocationSuccess 似乎没有在任何地方定义。看起来,如果你想使用提供给getLocation的回调,你需要像dispatch(cb(data));这样调用dispatch,或者将getLocation的参数名称更改为getLocationSuccess

export const getLoaction = (getLocationSuccess: Function) => 

  return (dispatch: Function, getState: Function) => 

    const  locationState  = getState();
    const  latitude, longitude  = locationState.region;
    axios.get(`https://maps.googleapis.com/maps/api/geocode/json?latlng=$latitude,$longitude&key=<API KEY>`)
    .then(json => 

      const address = json.data.results[0].formatted_address;

      const data = 
        loading: false,
        currentLocation: address
      ;

      dispatch(getLocationSuccess(data));   
    )
    .catch((err: any) => 
      console.log('NAVIGATOR FAILED: ', err)
    )
  

【讨论】:

getLocationSuccess() 在上面定义。对不起,我刚刚添加了它。我需要它来通知减速器更新状态。

以上是关于如何修复 redux/redux thunk 抛出的“Uncaught TypeError: callback is not a function”?的主要内容,如果未能解决你的问题,请参考以下文章

promise + redux + redux-thunk:打字稿错误“不可分配给类型'Promise<any>”

Redux 等待异步 thunk 继续进行

何时使用 Redux-saga / Redux thunk 何时不使用? [关闭]

使用 React Redux Redux-Thunk 进行 Firebase 身份验证

Redux等待异步thunk继续前进

Redux - 如何调用一个动作并等待它解决