我正在使用Redux,并向RESTful API分派Redux Thunk Fetch调用以验证登录凭据。 API已成功在响应中返回JWT(授权令牌)。
我的Reducer配置为使用此令牌更新商店,但它返回的是“未定义”而不是令牌。我可以在Redux Logger Action有效负载中看到Token-所以我不确定发生了什么。
我怀疑这是因为API无法足够快地发送令牌,并且我的Reducer正在使用未解决的值进行更新。日志确实暗示了这一点,但是我也很困惑为什么-当我在console.log中打开动作时,Promise的状态会在同一条目中从待定变为已实现!
我将发布Action + Reducer代码和相关的控制台日志-如果有人能指出我错误的正确方向,我将不胜感激:
/// REDUCERS
const initialState = { isAuthenticated: false}
const authReducer = (state = initialState, action) => {
switch(action.type){
case ('USER_AUTHENTICATED'): {
return Object.assign({}, state, {
isAuthenticated: true,
token: action.userInfo.token,
}
)
}
case ('INVALID_CREDENTIALS'): {
return Object.assign({}, state, {
isAuthenticated:false
}
)
}
default:
return state
}
/// ACTIONS
function authSuccess (userInfo) {
return {
type:'USER_AUTHENTICATED',
userInfo
}
}
function authFail () {
return {
type: 'INVALID_CREDENTIALS'
}
}
export function attemptLogIn(credentials) {
return dispatch => {
return fetch('http://localhost:3001/authorize', {
headers:{
'Content-Type': 'application/json'
},
method: 'POST',
mode: 'cors',
body: JSON.stringify(credentials)
})
.then(response => response.ok ? dispatch(authSuccess(response.json())) : dispatch(authFail()))
}
}
最初,Redux日志将操作显示为待处理的承诺:
这由令牌“未定义”反映
但是,当我打开相同的动作时,我可以清楚地看到Promise的状态已更改为解决方案,并且令牌实际上就在那。
我假设authSuccess()调度仅在收到(response.ok)后才会触发-那么Promise仍如何待处理?
感谢任何帮助!
最佳答案
原因是您正在调度reponse.json()
,它自己将返回promise
另外,您需要将json
结果从fetch
传递回authSuccess
操作创建者
将代码更改为:
.then(response => response.ok ? response.json() : throw new Error(response.statusText))
.then(json => dispatch(authSuccess(json))
.catch(err => dispatch(authFail()))
关于javascript - 为什么尽管收到有效的操作有效负载(异步身份验证调用),我的Redux状态仍未更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48198286/