您可以使用redux thunk或任何其他中間件(例如REDX傳奇)來解決令牌問題。 Redux thunk可以讓動作創建者返回一個函數,而不是一個動作。
export function checkTokenValidity(token) {
return (dispatch) => {
dispatch(TOKEN_CHECK_REQUEST());
return (AsyncAPICall)
.then((response) => {
dispatch(TOKEN_CHECK_SUCCESS(response.data));
})
.catch((err) => {
console.log(err);
});
};
}
export function getData(id) {
return (dispatch) => {
dispatch(GETDATA_REQUEST());
return (AsyncAPICall(id))
.then((response) => {
dispatch(GETDATA_SUCCESS(response.data));
})
.catch((err) => {
console.log(err);
});
};
}
export function checkTokenAndGetData(token,id) {
return (dispatch) => {
dispatch(checkTokenValidity(token)).then(() => {
dispatch(getData(id));
});
};
}
這種方法的問題是代碼很容易混亂,因爲每次都必須將令牌檢查和任意API調用結合起來。
這是一個好一點。 (2)(如果你想在動作創建者中調用它進行狀態跟蹤)在請求中傳遞令牌,讓一箇中間件攔截請求並將響應改爲「無效令牌/過期令牌」,或者真正的數據有一個乾淨可讀的前端代碼。
export function getData(token,id) {
return (dispatch) => {
dispatch(GETDATA_REQUEST());
return (AsyncAPICall(id))
.then((response) => {
//if response is EXPIRED token
dispatch(renewToken()); // renew token is another action creator
//else
dispatch(GETDATA_SUCCESS(response.data));
})
.catch((err) => {
console.log(err);
});
};
}
我的建議是將您的令牌驗證移動到您的後端。 (3)總是在請求中傳遞令牌,讓中間件攔截請求,如果它過期,請在後端代碼中更新它。爲您的回覆添加一個標識符,表明它已過期並將其更新。簡單得多。