这不仅仅是一个问题,而是我面临的一个问题。我有一个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中更新太迟。
我希望这很明确,你们可以给我一些建议。谢谢!