J'ai un composant qui a une forme où pour le moment faire cliquer sur le bouton soumettre, j'appelle une fonction handleSubmit
(c'est sur mon composant), cette fonction appelle une action via dispatch et cette action, je passe un appel à un service (HTTP Request).
handleSubmit
function addDevice(params, token){ return axios({ url: 'http://localhost:5000/user/add-device', method: 'POST', headers: { 'Authorization': 'Bearer ' + token}, data: { data1: params.data1, data2: params.data2, data3: params.data3 } }) .then(function(response) { return response; }) .catch(function(error) { return error.response; }); }
actions.addDevice
function addDevice(params){ return (dispatch, getState) => { let { authentication } = getState(); dispatch(request({})); service.addDevice(params, authentication.user.access_token) .then( response => { if(response.status === 201) { dispatch(success(response.data)); } return response; }, error => { dispatch(failure(error.toString())); dispatch(alertActions.error(error.toString())); } ) } function request(response) { return { type: constants.ADD_DEVICE_REQUEST, response } } function success(response) { return { type: constants.ADD_DEVICE_SUCCESS, response } } function failure(error) { return { type: constants.ADD_DEVICE_FAILURE, error } } }
service.addDevice
handleSubmit = (e) => { e.preventDefault() const { validateFields } = this.props.form; validateFields((err, params) => { if (!err) { const { user, dispatch } = this.props; let response = dispatch(actions.addDevice(params)) console.log(response); //Response is undefined } }); }
I souhaite obtenir la réponse dans mon composant pour pouvoir effectuer des validations mais comme la requête est asynchrone, je ne peux jamais obtenir la réponse et n'imprime qu'une variable indéfinie. Comment puis-je synchroniser la réponse? Ou que dois-je faire pour pouvoir effectuer des validations?
3 Réponses :
Vous ne renvoyez pas la promesse service.addDevice
.
Vous pouvez donc renvoyer service.addDevice ...
et dans handleSubmit
vous effectuez dispatch (...). then ((data) = > ... faire quelque chose avec les données ...)
handleSubmit = (e) => { e.preventDefault() const { validateFields } = this.props.form; validateFields(async (err, params) => { if (!err) { const { user, dispatch } = this.props; let response =await dispatch(actions.addDevice(params)) console.log(response); //Response is undefined } }); }
Veuillez remplacer votre code par ce code
handleSubmit
function addDevice(params){ return (dispatch, getState) => { let { authentication } = getState(); dispatch(request({})); return service.addDevice(params, authentication.user.access_token) .then( response => { if(response.status === 201) { dispatch(success(response.data)); } return response; }, error => { dispatch(failure(error.toString())); dispatch(alertActions.error(error.toString())); } ) } function request(response) { return { type: constants.ADD_DEVICE_REQUEST, response } } function success(response) { return { type: constants.ADD_DEVICE_SUCCESS, response } } function failure(error) { return { type: constants.ADD_DEVICE_FAILURE, error } } }
actions.addDevice
handleSubmit = (e) => { e.preventDefault() const { validateFields } = this.props.form; validateFields((err, params) => { if (!err) { const { user, dispatch } = this.props; dispatch(actions.addDevice(params)).then((response)=>{ console.log(response); }) } }); }
Pour utiliser la réponse dans votre composant, vous devez faire 3 autres choses: Créez un réducteur sur
ADD_DEVICE_REQUEST
pour mettre à jour l'état de redux, créez une fonction de sélection pour récupérer la variable que vous avez modifiée dans l'état, puis ajoutez un prop au composant égal au résultat de ce sélecteur avec une fonctionmapStateToProps