如何正确处理与Saga和Redux的大量套接字连接

时间:2018-06-06 16:38:48

标签: reactjs react-native redux redux-saga

这不仅仅是一个问题,而是我面临的一个问题。我有一个React Native应用程序,其中一部分允许用户在套接字通道中相互聊天。我正在使用凤凰插座,因为我的后端在凤凰城。

我设置了我的传奇,听听通过eventChannel进入的聊天,然后发出事件,然后我可以发送动作。

function* listenEvent() {
  let event = yield call(eventSubscriptions, lobbyChannel)

  while (true) {
    let action = yield take(event)

    yield put(action)
  }
}

function eventSubscriptions(lobbyChannel) {
  return eventChannel(emitter => {
    lobbyChannel.on('user:chat', event => {
      emitter(eventActions.messagesReceived(event.message)))
    })
    ...
  })
}

// reducer/reduxsauce
// message coming in will be merge into the reducer
export const messagesReceived = (state, action) =>
  state.merge({
    fetching: false,
    messages: [...state.messages, action.message]
  })

这很有效,只有少数用户互相聊天。我认为这次聊天非常忙碌。想想聊天就像HQ Trivia聊天一样 - 它的繁忙和大量的消息可能会同时进入。

回到实施。当我尝试模拟大量的聊天消息请求时,新聊天不会在UI中更新。应用程序的某些部分没有响应,但有些仍然可以互动(我仍然可以滚动聊天,应用程序的其他部分)

片刻之后,模拟器将崩溃并显示消息maximum update depth exceeded...。此消息指向listenEvent操作put的{​​{1}}功能,我觉得这很有意义。我看到这更多关于Redux无法处理它随后爆发的大量队列,而不是Saga的问题或套接字如何工作。现在我正在考虑如何处理这个问题。我考虑过去抖动发射器,但这也意味着一些聊天可能会在这个过程中迷失。

我已经考虑过使用redux-batch和其他批处理解决方案了,但是我无法将自己包含在如何使用当前设置进行操作的情况下,尤其是如何将我的操作转换为数组然后我什么时候发货呢?如果我发送得太晚,那么消息将在UI中更新太迟。

我希望这很明确,你们可以给我一些建议。谢谢!

0 个答案:

没有答案