Отправка действий в лучших практиках Redux?

У меня есть большой проект, над которым я работаю на работе, и мне интересно, как правильно отправлять действия.

В моем контейнере для моего компонента я сопоставляю эту функцию.

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

Вы можете видеть, что я передаю функцию отправки в свою службу.

Мне нужно передать отправку, поэтому в случае сбоя события сокета я могу отправить действие ошибки внутри службы.

Это нормально делать? Или было бы лучше всегда держать отправку в контейнерах. Если бы я превратил эту сервисную функцию сокета в обещание, я мог бы сделать это тогда, но тогда мы можем добавить слишком много логики к функции отправки в контейнере?

Можно ли передавать объект отправки?

Изменить: вот фрагмент моей службы сокетов. При возникновении ошибки из моего сокета мне нужно отправить ошибку:

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));
};

Затем в моих действиях.js у меня есть следующие действия:

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
});

person Matt Belanger    schedule 29.08.2016    source источник


Ответы (1)


Я думаю, что вы должны сохранить функцию отправки внутри контейнера и отделить асинхронный вызов API в другом файле и импортировать эту функцию для использования в этом файле. Также покажите нам, как вы делаете эти асинхронные вызовы, такие как chatSocketSevice, используя redux-thunk или redux-saga. Я чувствую, что тогда я мог бы быть более полезным.

person slopeofhope    schedule 29.08.2016
comment
Спасибо за ответ. Я отредактировал свой пост, включив в него некоторые из моих сервисов сокетов. - person Matt Belanger; 30.08.2016
comment
Я не делаю никаких асинхронных вызовов в своих действиях. Я просто жду обратного вызова от сервера, если есть ошибка с моим событием emit, а затем отправляю ошибку. - person Matt Belanger; 30.08.2016
comment
поэтому я не думаю, что с вашим подходом что-то не так, кроме того, что позже, когда ваш код станет больше, будет очень сложно отлаживать. поэтому вы используете redux-saga или redux thunk, чтобы избежать передачи отправки в качестве аргумента. - person slopeofhope; 30.08.2016