当我订阅套接字io事件时,我得到了重复的操作触发。
const onStartGameActionEpic = (action$, state$) =>
action$.pipe(
ofType(ON_START_GAME),
mergeMap(() =>
fromEvent(socket, 'newGameCreated').pipe(
map(response => onStartGameFulfilled(response)),
),
),
);
每次ON_START_GAME
发生时,您都会创建一个新的侦听器,但您永远不会扼杀旧的侦听器。这就是问题的根源。
修复1
将mergeMap
更改为switchMap
。
修复2
您可能希望同时进行多个游戏。如果是,请为ON_START_GAME
动作指定一个namespace
道具。当游戏结束动作触发时,杀死特定的可观察对象。
const onStartGameActionEpic = (action$, state$) =>
action$.pipe(
ofType(ON_START_GAME),
mergeMap(onStartGameAction =>
fromEvent(socket, 'newGameCreated').pipe(
takeUntil(action$.pipe(
ofType(ON_END_GAME),
filter(onEndGameAction => (
endGameAction.namespace === startGameAction.namespace
)),
)),
map(response => onStartGameFulfilled(response)),
),
),
);