rebuildBlocks()

in client/client/modules/render/heatmap/renderer/data-renderer/index.js [286:349]


    rebuildBlocks(isCancelledFn) {
        if (isCancelledFn() || !this.data.dataReady) {
            return Promise.resolve();
        }
        return new Promise((resolve) => {
            this._updating = true;
            this.emit(events.updating);
            const generator = this.data.data.entries();
            const totalElements = this.data.data.count || Infinity;
            const previousColumnsRowsReordered = this.columnsRowsReordered;
            this.columnsRowsReordered = this.data && this.data.metadata
                ? this.data.metadata.columnsRowsReordered
                : false;
            const dendrogramModeChanged = previousColumnsRowsReordered !== this.columnsRowsReordered &&
                previousColumnsRowsReordered !== undefined;
            const batch = dendrogramModeChanged ||
                totalElements >= RENDER_ON_BATCH_UPDATE_THRESHOLD;
            if (batch) {
                this.blocks.forEach(block => block.batchInsertStart());
            }
            const frame = () => {
                /**
                 * @type {HeatmapGraphicsBase}
                 */
                let currentBlock;
                let i = 0;
                let item;
                let done = false;
                const next = () => {
                    const nextResult = generator.next();
                    done = nextResult.done;
                    item = nextResult.value;
                };
                do {
                    if (isCancelledFn()) {
                        break;
                    }
                    next();
                    if (!done && item) {
                        if (!currentBlock || !currentBlock.testDataItem(item)) {
                            currentBlock = this.findBlockByItem(item, {batch});
                        }
                        if (currentBlock) {
                            currentBlock.appendDataItem(item, batch);
                        }
                    }
                    i += 1;
                } while (i < ITERATIONS_PER_FRAME && !done);
                this.requestRender();
                this.dataProcessed = !isCancelledFn() && done;
                if (isCancelledFn() || done) {
                    if (batch && this.dataProcessed) {
                        this.blocks.forEach(block => block.batchUpdateDone(dendrogramModeChanged));
                    }
                    this._updating = false;
                    this.emit(events.updating);
                    resolve();
                } else {
                    setTimeout(frame, 0);
                }
            };
            frame();
        });
    }