diff options
| -rw-r--r-- | src/App.vue | 9 | ||||
| -rw-r--r-- | src/components/TimeLine.vue | 8 | ||||
| -rw-r--r-- | src/lib.ts | 4 |
3 files changed, 16 insertions, 5 deletions
diff --git a/src/App.vue b/src/App.vue index 5bf6458..17760b0 100644 --- a/src/App.vue +++ b/src/App.vue @@ -39,7 +39,8 @@ import PlusIcon from './components/icon/PlusIcon.vue'; import SettingsIcon from './components/icon/SettingsIcon.vue'; import HelpIcon from './components/icon/HelpIcon.vue'; // Other -import {HistDate, TimelineState, HistEvent, queryServer, HistEventJson, jsonToHistEvent, cmpHistEvent} from './lib'; +import {HistDate, TimelineState, HistEvent, queryServer, HistEventJson, jsonToHistEvent, cmpHistEvent, + timeout} from './lib'; import {useStore} from './store'; import {RBTree, rbtree_shallow_copy} from './rbtree'; @@ -191,7 +192,12 @@ function reduceEvents(){ } // For getting events from server const EVENT_REQ_LIMIT = 10; +let pendingReq = false; // Used to serialise event-req handling async function onEventReq(startDate: HistDate, endDate: HistDate){ + while (pendingReq){ + await timeout(100); + } + pendingReq = true; // Exclude exhausted range if (isExhaustedRange(startDate, endDate)){ return; @@ -238,6 +244,7 @@ async function onEventReq(startDate: HistDate, endDate: HistDate){ if (eventTree.value.size > EXCESS_EVENTS_THRESHOLD){ reduceEvents(); } + pendingReq = false; } // For resize handling diff --git a/src/components/TimeLine.vue b/src/components/TimeLine.vue index 577413d..88ac62d 100644 --- a/src/components/TimeLine.vue +++ b/src/components/TimeLine.vue @@ -254,7 +254,6 @@ const ticks = computed((): Ticks => { }); // For displayed events -let pendingReq = false; const idToEvent = computed(() => { // Maps visible event IDs to HistEvents let map: Map<number, HistEvent> = new Map(); // Find events to display @@ -267,10 +266,12 @@ const idToEvent = computed(() => { // Maps visible event IDs to HistEvents } map.set(event.id, event); } - pendingReq = false; return map; }); const idToPos = computed(() => { + if (!mounted.value){ + return new Map(); + } let map: Map<number, [number, number, number, number]> = new Map(); // Maps visible event IDs to x/y/w/h let numUnits = getNumVisibleUnits(); let minorAxisStep = 0; @@ -283,12 +284,11 @@ const idToPos = computed(() => { minorAxisStep += 10; } // If more events could be displayed, notify parent - if (map.size < 3 && !pendingReq){ + if (map.size < 3){ emit('event-req', startDate.value, endDate.value); } else { // Send displayed event IDs to parent emit('event-display', [...idToEvent.value.keys()], ID); } - pendingReq = true; // return map; }); @@ -11,6 +11,10 @@ export const WRITING_MODE_HORZ = export function moduloPositive(x: number, y: number){ return x - Math.floor(x / y) * y; } +// Used to async-await for until after a timeout +export async function timeout(ms: number){ + return new Promise(resolve => setTimeout(resolve, ms)) +} // For calendar conversion. Mostly copied from backend/hist_data/cal.py export function gregorianToJdn(year: number, month: number, day: number): number { |
