我正在使用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日志将操作显示为待处理的承诺:

javascript - 为什么尽管收到有效的操作有效负载(异步身份验证调用),我的Redux状态仍未更新-LMLPHP

这由令牌“未定义”反映
javascript - 为什么尽管收到有效的操作有效负载(异步身份验证调用),我的Redux状态仍未更新-LMLPHP

但是,当我打开相同的动作时,我可以清楚地看到Promise的状态已更改为解决方案,并且令牌实际上就在那。

javascript - 为什么尽管收到有效的操作有效负载(异步身份验证调用),我的Redux状态仍未更新-LMLPHP

我假设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/

10-14 13:02