#reactjs #redux-saga #redux-actions
#reactjs #redux-сага #redux-действия
Вопрос:
Я изучаю react и пытаюсь заставить Redux работать, поэтому я использую Redux-logger. При отправке двух действий из App.js это работает так, как показано на верхнем изображении «ALBUME_DATA_LOADED».
Затем я делаю отправку из другого места и получаю этот вывод:
Я не уверен, что отправил это действие «объект, объект». Я помещаю точку останова и журнал консоли, и странно, что react-logger улавливает действие, которое, я думаю, я не отправил..
Есть идеи?
Вот типы действий, которые я использую в приведенном ниже коде как userActionTypes
:
Файл user.types.js:
export const userActionTypes = {
SAVE_USER_START: 'SAVE_USER_START',
SAVE_USER_SUCCESS: 'SAVE_USER_SUCCESS',
SAVE_USER_FAILURE: 'SAVE_USER_FAILURE',
};
Вот действие:
Файл user.actions.js;
import { userActionTypes } from './user.types';
import { withFirebase } from '../../firebase';
import * as ROLES from '../../constants/roles';
const saveUserStart = () => ({
type: userActionTypes.SAVE_USER_START,
});
const saveUserSuccess = user => ({
type: userActionTypes.SAVE_USER_SUCCESS,
payload: user,
});
const saveUserFailure = errMsg => ({
type: userActionTypes.SAVE_USER_FAILURE,
payload: errMsg,
});
const asyncSaveUser = ({ firestore }) => {
return async dispatch => {
const userRef = firestore.userDoc(firestore.auth.currentUser.uid);
dispatch(saveUserStart());
firestore.db
.runTransaction(transaction => {
// This code may get re-run multiple times if there are conflicts.
return transaction.get(userRef).then(doc => {
if (!doc.exists) {
return Promise.reject('Transaction failed: User dont exist!');
}
const newRoles = doc.data().roles;
// new roll
newRoles.push(ROLES.USER);
// remove roll
newRoles.splice(newRoles.indexOf('ANONYMOUS'), 1);
// save it back
transaction.update(userRef, { roles: newRoles });
return newRoles;
});
})
.then(newRoles => {
dispatch(saveUserSuccess());
console.log(`Transaction successfully committed role(s): ${newRoles}`);
})
.catch(error => {
dispatch(saveUserFailure(error));
console.log(error);
});
};
};
export default withFirebase(asyncSaveUser);
Комментарии:
1. У вас есть какое-то действие,
type
свойство которого является объектом, когда оно должно быть строкой. Вам нужно будет показать нам фактический код действия, а не только скриншот ошибки.2. Спасибо, я добавил код к своему вопросу
3. И как вы используете
asyncSaveUser
Ответ №1:
в dispatch saveUserSuccess() вы не можете передавать новые роли.
dispatch(saveUserSuccess(newRoles));
Комментарии:
1. Спасибо, ваше право должно передать пользовательский объект — что-
firestore.auth.currentUser
то
Ответ №2:
Причиной этого является ваш mapDispatchToProps.
const mapDispatchToProps = dispatch => ({
saveUser: () => dispatch(asyncSaveUser())
});
asyncSaveUser()
не является создателем действия.
Комментарии:
1. Да, мне здесь нужно промежуточное программное обеспечение. Я использую промежуточное ПО Redux Saga для двух других действий и хотел не использовать Saga, поскольку это не сложный вызов. Какое промежуточное программное обеспечение вы предлагаете здесь? Удар?
2. Вы можете просто использовать redux saga, поскольку она у вас уже есть. Пусть этот генератор fn запускается каждый
takeLatest(SAVE_USER_ASYNC, asnycSaveUser)
.