diff options
author | Anton Tananaev <anton@traccar.org> | 2022-05-28 14:18:22 -0700 |
---|---|---|
committer | Anton Tananaev <anton@traccar.org> | 2022-05-28 14:18:22 -0700 |
commit | 941b4d5b8d365653f25937961c4b931ebebd4e6f (patch) | |
tree | f059067a816e024ddc790e901702e6180503231b | |
parent | b61bf1e1ca6a8ff2ef3cacd4c38d57f6a46ee69b (diff) | |
download | trackermap-web-941b4d5b8d365653f25937961c4b931ebebd4e6f.tar.gz trackermap-web-941b4d5b8d365653f25937961c4b931ebebd4e6f.tar.bz2 trackermap-web-941b4d5b8d365653f25937961c4b931ebebd4e6f.zip |
Throttle frequent updates (fix #932)
-rw-r--r-- | modern/src/store/index.js | 6 | ||||
-rw-r--r-- | modern/src/store/throttleMiddleware.js | 39 |
2 files changed, 44 insertions, 1 deletions
diff --git a/modern/src/store/index.js b/modern/src/store/index.js index 72867b76..2ab0c982 100644 --- a/modern/src/store/index.js +++ b/modern/src/store/index.js @@ -8,6 +8,7 @@ import { geofencesReducer as geofences } from './geofences'; import { groupsReducer as groups } from './groups'; import { driversReducer as drivers } from './drivers'; import { maintenancesReducer as maintenances } from './maintenances'; +import throttleMiddleware from './throttleMiddleware'; const reducer = combineReducers({ errors, @@ -29,4 +30,7 @@ export { groupsActions } from './groups'; export { driversActions } from './drivers'; export { maintenancesActions } from './maintenances'; -export default configureStore({ reducer }); +export default configureStore({ + reducer, + middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(throttleMiddleware), +}); diff --git a/modern/src/store/throttleMiddleware.js b/modern/src/store/throttleMiddleware.js new file mode 100644 index 00000000..9954b139 --- /dev/null +++ b/modern/src/store/throttleMiddleware.js @@ -0,0 +1,39 @@ +import { batch } from "react-redux"; + +const threshold = 3; +const interval = 1500; + +export default () => (next) => { + const buffer = []; + let throttle = false; + let counter = 0; + + setInterval(() => { + console.log('batch'); + if (throttle) { + if (buffer.length < threshold) { + throttle = false; + } + batch(() => buffer.splice(0, buffer.length).forEach((action) => next(action))); + } else { + if (counter > threshold) { + throttle = true; + } + counter = 0; + } + }, interval); + + return (action) => { + console.log(action); + if (action.type === 'devices/update' || action.type === 'positions/update') { + if (throttle) { + buffer.push(action); + } else { + counter += 1; + return next(action); + } + } else { + return next(action); + } + }; +}; |