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();
});
}