请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师好,dispatch的catch不被触发

我的dispatch是这样的

    dispatch(loginAction(params))
    .then((action) => {
      console.log(action)
      message.success('登录成功')
      navigate('/')
    })
    .catch((error) => {
      message.error('error')
    })

store的异步设这样写的

export const loginAction = createAsyncThunk("user/loginAction", async (payload: UserApi.LoginParam) => {
   return await userApi.getToken(payload)
})

我先把后端服务关了,那么这个请求一定会超时报错

结果login页面中的dispatch().then().catch(),中并没有触发catch,而是触发了then(),这是打印的then的参数,也就是说即使失败了,diapatch也认为是成功的,只是把错误信息给带回来了,有点不能理解为啥是这样,直接触发catch多好,这样就不用去判断了

{
    "type": "user/loginAction/rejected",
    "meta": {
        "arg": {
            "username": "panda",
            "password": "123456"
        },
        "requestId": "Jk8otrRUGQ9V4OPak93Nu",
        "rejectedWithValue": false,
        "requestStatus": "rejected",
        "aborted": false,
        "condition": false
    },
    "error": {
        "name": "AxiosError",
        "message": "Network Error",
        "stack": "AxiosError: Network Error\n    at XMLHttpRequest.handleError (http://localhost:8080/static/js/bundle.js:68015:14)",
        "code": "ERR_NETWORK"
    }
}

正在回答 回答被采纳积分+3

1回答

西门老舅 2023-07-16 20:08:50

你好,这个主要看后端的处理,有时候后端是会返回状态码200的,而把错误信息通过json数据来体现。当然后端也可以返回不是成功的状态码,比如500等等,这样就会走catch,所以走then还是catch主要是后端处理不同导致的,所以最好then还catch都进行错误的处理,或跟后端确定情况再处理错误形式。 

0 回复 有任何疑惑可以回复我~
  • 提问者 Panda_io #1
    感谢老师答复,但是我这里没有启动后端,就是网络连接不通的时候都是走的then,这就很不科学
    回复 有任何疑惑可以回复我~ 2023-07-16 20:39:20
  • 西门老舅 回复 提问者 Panda_io #2
    这种情况最好检查一下代码,正常来说网络不通,是会走catch的
    回复 有任何疑惑可以回复我~ 2023-07-17 10:32:39
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信