Я использую React / Redux для приложения, которое я создаю, и пытаюсь реализовать действие для выхода пользователя из системы. В моем приложении есть артефакты, которые можно редактировать. Я хочу, чтобы мое приложение сначала сохранило артефакт, а затем вышло из системы, чтобы очистить хранилище. Я реализовал это следующим образом, используя Redux Thunk:
export function logoutUser(artifact) {
return (dispatch) => {
dispatch(saveArtifact(artifact))
.then(() => {
dispatch(requestLogout());
return axios.get(`${API_BASE}/auth/logout`)
.then(() => dispatch(logoutSuccess()))
.catch(error => dispatch(logoutFailure(error)));
});
};
}
Я ожидаю, что это сохранит артефакт и только когда он будет сохранен, выйдите из системы. Мое действие сохранения вызывает другое действие, которое загружает артефакты после их сохранения, но это не должно иметь значения. Он должен вернуть обещание и только затем перейти к выходу пользователя из системы.
Однако это не то, что происходит. По какой-то причине я получаю несколько вызовов для сохранения артефакта (проверено, что они поступают из этой функции), а затем вызовы происходят асинхронно, так что загрузка артефактов является последней, и, таким образом, мое хранилище избыточности не очищается при выходе из системы.
Буду рад, если кто-нибудь сможет дать понять, почему это происходит, и как я могу это исправить.
Дополнительная информация:
Я очищаю хранилище избыточности в моем корневом редукторе следующим образом:
const rootReducer = (state, action) => {
let newState = state;
if (action.type === types.LOGOUT_SUCCESS) {
newState = undefined;
}
return appReducer(newState, action);
};
Я сохраняю артефакты следующим образом:
function sendSaveArtifactRequest(artifact) {
if (artifact._id == null) {
const artifactWithoutId = _.omit(artifact, ['_id']);
return axios.post(`${API_BASE}/artifacts`, artifactWithoutId)
.then(result => result.data);
}
return axios.put(`${API_BASE}/artifacts`, artifact).then(() => artifact);
}
export function saveArtifact(artifact) {
return (dispatch) => {
dispatch(requestSaveArtifact());
return sendSaveArtifactRequest(artifact)
.then(data => dispatch(saveArtifactSuccess(data)))
.catch(error => dispatch(saveArtifactFailure(error)))
.then(() => dispatch(loadArtifacts()));
};
}
Я загружаю артефакты следующим образом:
function sendArtifactsRequest() {
return new Promise((resolve, reject) => {
axios.get(`${API_BASE}/artifacts`)
.then(result => resolve(result.data))
.catch(error => reject(error));
});
}
export function loadArtifacts() {
return (dispatch) => {
dispatch(requestArtifacts());
return sendArtifactsRequest()
.then(data => dispatch(loadArtifactsSuccess(data)))
.catch(error => dispatch(loadArtifactsFailure(error)));
};
}