Redux等待异步重击继续前进

时间:2018-09-26 22:23:34

标签: redux react-redux axios redux-thunk

我目前正在使用redux / redux-thunk像这样使用api-sauce获取用户

let authToken = await AsyncStorage.getItem('@TSQ:auth_token')

if (authToken) {
  store.dispatch(fetchUser(authToken))
  console.log('show login screen')
  // dont worry, if the token is invalid, just send us to onboarding (api determines this)
  loggedInView()
} else {
  Onboarding ()
}

....

export const fetchUser = authToken => async dispatch => {
  console.log('dispatching auth token')

  console.log('here goes request')
  let res = await api.get(`/auth/${authToken}`);

  if (res.ok) {
    console.log('have the user')
    dispatch(
      setUser(res.data)
    )
  } else {
    dispatch({
      type: 'SET_USER_DEFAULT'
    })
}

}

运行此代码后,用户仍在加载并且console.logs混乱

`dispatching auth token`
`here goes request`
`show login screen`

为什么会这样?

1 个答案:

答案 0 :(得分:2)

这是因为对store.dispatch(fetchUser(authToken))的实际调用是同步的-dispatch()方法is not asynchronous,因此执行“ {{1}”后将立即发生日志“显示登录屏幕” }方法。

如果您希望在网络请求返回响应(即对异步方法fetchUser()的调用)之后执行loggedInView(),那么可以考虑通过以下方式重构代码:

api.get()

然后:

if (authToken) {
  store.dispatch(fetchUser(authToken))
  // Remove navigation from here
} else {
  Onboarding ()
}

希望这会有所帮助!