2016-08-29 2 views
0

J'ai un gros projet sur lequel je travaille au travail et je m'interroge sur la bonne façon de répartir les actions.Distribuer des actions dans les meilleures pratiques Redux?

Dans mon conteneur pour mon composant, je mappe cette fonction.

const mapDispatchToProps = (dispatch) => { 
    return { 
     ackMessage:(convo)=> { 
     chatSocketService.messageAcknowledge(convo, dispatch); 
    } 
} 

Vous pouvez voir que je passe la fonction d'expédition à mon service.

Je dois passer l'expédition ainsi au cas où l'événement de douille échoue je peux expédier une action d'erreur à l'intérieur du service.

Est-ce que je peux le faire? Ou serait-il préférable de toujours garder l'expédition dans les conteneurs. Si je transformais cette fonction de service de socket en une promesse que je pourrais faire alors, mais alors nous pourrions ajouter trop de logique à la fonction d'expédition dans le conteneur?

Est-ce que le fait de passer l'objet dispatch est correct?

Modifier: Voici un extrait de mon service de socket. En cas d'erreur de ma prise émets je dois envoyer une erreur:

const chatSocketService = { 
     messageAcknowledge(convo, dispatch) { 
     const socketConnection = getSocket(); 
     socketConnection.emit(socketMessages.ACKNOWLEDGE_MESSAGE, {convoID:convo.convoID, msgID:convo.lastMsg.msgID }, 
      (response)=> { 
       socketError(response, convo, dispatch); 
      }); 
     } 
} 

const socketError = (response, convo, dispatch) => { 
    if (response.error === CHAT_SESSION_EXPIRE) { 
    sessionExpire(dispatch); 
    } else if(response.error) { 
    dispatch(convoError(convo.convoID, true)); 
    } 
}; 

const sessionExpire = (dispatch)=> { 
    dispatch(disconnectedMessage('Session has expired. Please log out and log back in')); 
    dispatch(socketDisconnected(true)); 
}; 

Puis dans mes actions.js Je ces actions:

export const CONVO_ERROR = 'CHAT_CONVO_ERROR'; 
export const convoError = (convoID, error) => ({ 
    type:CONVO_ERROR, 
    convoID, 
    error 
}); 

export const SOCKET_DISCONNECTED = 'CHAT_SOCKET_DISCONNECTED'; 
export const socketDisconnected = (disconnected)=> ({ 
    type:SOCKET_DISCONNECTED, 
    disconnected 
}); 

Répondre

0

Je pense que vous devez garder la fonction d'expédition à l'intérieur du conteneur et séparez l'appel api asynchrone dans un fichier différent et importez cette fonction à utiliser dans ce fichier. Montrez-nous aussi comment vous faites ces appels asynchrones comme chatSocketSevice en utilisant redux-thunk ou redux-saga .. Je sens que je pourrais être plus utile.

+0

Merci pour la réponse. J'ai édité mon post pour inclure une partie de mon service de douille. –

+0

Je ne fais aucun appel asynchrone dans mes actions. J'attends juste le rappel du serveur s'il y a une erreur avec mon événement d'émission, puis envoie une erreur. –

+0

donc je ne pense pas qu'il y ait quelque chose de mal avec votre approche, sinon qu'il serait très difficile de déboguer plus tard, car votre code grossit. vous utilisez donc redux-saga ou redux thunk pour éviter de passer le dispatch en argument. – slopeofhope