我目前正在使用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`
为什么会这样?
答案 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 ()
}
希望这会有所帮助!