diff --git a/lib/shared/dm-ops/dm-ops-queue-handler.react.js b/lib/shared/dm-ops/dm-ops-queue-handler.react.js --- a/lib/shared/dm-ops/dm-ops-queue-handler.react.js +++ b/lib/shared/dm-ops/dm-ops-queue-handler.react.js @@ -63,12 +63,13 @@ }, [prune]); const threadInfos = useSelector(threadInfoSelector); - const prevThreadInfosRef = React.useRef({}); const queuedThreadOperations = useSelector( state => state.queuedDMOperations.threadQueue, ); + const runningThreadOperations = React.useRef>(new Set()); + const processDMOperation = useProcessDMOperation(); const processItem = React.useCallback( @@ -96,13 +97,17 @@ const { enqueue } = useActionsQueue(processItem); React.useEffect(() => { - const prevThreadInfos = prevThreadInfosRef.current; - prevThreadInfosRef.current = threadInfos; - for (const threadID in queuedThreadOperations) { - if (!threadInfos[threadID] || prevThreadInfos[threadID]) { + if (!threadInfos[threadID]) { + continue; + } + + if (runningThreadOperations.current.has(threadID)) { continue; } + + runningThreadOperations.current.add(threadID); + enqueue([ ...queuedThreadOperations[threadID].map(item => ({ type: 'operation', @@ -117,6 +122,10 @@ }, }, }, + { + type: 'function', + itemFunction: () => runningThreadOperations.current.delete(threadID), + }, ]); } }, [dispatch, enqueue, queuedThreadOperations, threadInfos]);