From 4408ca1eb7e32fb805c55ac14f185925a775f96c Mon Sep 17 00:00:00 2001 From: Braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Thu, 25 Nov 2021 17:23:28 +0100 Subject: [PATCH] refactor(graph): async process elements * process elements in chunks of 50 per ms to avoid blocking main thread Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com> refactor(flow): deferr initial loading to Renderer.vue component --- src/store/stateStore.ts | 8 ++++++-- src/types/store.ts | 2 +- src/utils/graph.ts | 17 ++++++++--------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/store/stateStore.ts b/src/store/stateStore.ts index ec255c91..6dadf146 100644 --- a/src/store/stateStore.ts +++ b/src/store/stateStore.ts @@ -11,6 +11,7 @@ import { getSourceTargetNodes, isEdge, parseElements, + processElements, } from '~/utils' const pinia = createPinia() @@ -84,9 +85,11 @@ export default (id: string, preloadedState: FlowState) => { }, }, actions: { - setElements(elements) { + async setElements(elements) { const { nodes, edges } = parseElements(elements, this.elements, this.nodeExtent) - this.elements = [...nodes, ...edges] + await processElements([...nodes, ...edges], (processed) => { + this.elements = [...this.elements, ...processed] + }) }, setUserSelection(mousePos) { this.selectionActive = true @@ -179,6 +182,7 @@ export default (id: string, preloadedState: FlowState) => { this.elements = [...this.elements, ...nodes, ...edges] }, setState(state) { + if (typeof state.loading !== 'undefined') this.loading = state.loading if (typeof state.panOnScroll !== 'undefined') this.panOnScroll = state.panOnScroll if (typeof state.panOnScrollMode !== 'undefined') this.panOnScrollMode = state.panOnScrollMode if (typeof state.panOnScrollSpeed !== 'undefined') this.panOnScrollSpeed = state.panOnScrollSpeed diff --git a/src/types/store.ts b/src/types/store.ts index 232b132a..80c9bbc8 100644 --- a/src/types/store.ts +++ b/src/types/store.ts @@ -73,7 +73,7 @@ export interface FlowState extends Omit { } export interface FlowActions { - setElements: (elements: Elements) => void + setElements: (elements: Elements) => Promise setUserSelection: (mousePos: XYPosition) => void updateUserSelection: (mousePos: XYPosition) => void unsetUserSelection: () => void diff --git a/src/utils/graph.ts b/src/utils/graph.ts index d48405bf..7e2884cd 100644 --- a/src/utils/graph.ts +++ b/src/utils/graph.ts @@ -313,19 +313,18 @@ export const getTransformForBounds = ( return [x, y, clampedZoom] } -export const processElements = (elements: Elements, fn: (element: Node | Edge) => void) => { +export const processElements = (elements: FlowElements, fn: (elements: FlowElements) => void) => { return new Promise((resolve) => { const chunk = 50 let index = 0 function doChunk() { - let cnt = chunk - while (cnt-- && index < elements.length) { - fn(elements[index]) - ++index - } - if (index < elements.length) { - // set Timeout for async iteration - nextTick(doChunk) + const chunkPos = chunk * index + const lastChunk = elements.length - chunkPos < chunkPos + const cnt = !lastChunk ? chunk : elements.length - chunkPos + fn(elements.slice(chunkPos, chunkPos + cnt)) + index++ + if (!lastChunk) { + setTimeout(doChunk, 1) } else { resolve(true) }