2016-08-29 2 views
0

У меня есть большой проект, над которым я работаю, и задаюсь вопросом о правильном способе отправки действий.Диспетчерские действия в лучших практиках Redux?

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

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

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

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

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

Проходит объект отправки вокруг ok, чтобы сделать?

Редактировать: Вот фрагмент моей службы сокетов. На событии ошибки из моего сокета испускать мне нужно послать сообщение об ошибке:

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

Тогда в моем actions.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 
}); 

ответ

0

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

+0

Спасибо за ответ. Я отредактировал мое сообщение, чтобы включить некоторые из моих сокетов. –

+0

Я не выполняю никаких асинхронных вызовов в своих действиях. Я просто ожидаю обратного вызова с сервера, если произошла ошибка с моим событием emit, а затем отправлена ​​ошибка. –

+0

, поэтому я не думаю, что с вашим подходом есть что-то не так, как это было бы очень сложно отладить позже, так как ваш код станет больше. поэтому вы используете редукс-сагу или редукцию, чтобы избежать отправки отправки в качестве аргумента. – slopeofhope

Смежные вопросы