0

我有一个正在工作的大型项目,并且想知道调度操作的正确方法。

在我的组件容器中,我映射了这个函数。

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

然后在我的 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
});
4

1 回答 1

0

我认为您应该将调度函数保留在容器内,并将异步 api 调用分离到不同的文件中,然后导入该函数以在该文件中使用。还向我们展示您如何使用 redux-thunk 或 redux-saga 进行诸如 chatSocketSevice 之类的异步调用。我觉得那样我会更有帮助。

于 2016-08-29T23:12:27.640 回答