@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 1.16 kB
JavaScript
export class UpdateQueue{queue=[];isProcessing=!1;rafId=null;CHUNK_SIZE=100;TIME_BUDGET=4;add(e){this.queue.push(e),this.scheduleProcessing()}scheduleProcessing(){this.isProcessing||this.queue.length===0||(this.isProcessing=!0,this.queue.length<=this.CHUNK_SIZE*2?Promise.resolve().then(()=>this.processMicrotaskQueue()):this.rafId=requestAnimationFrame(e=>{this.processQueue(e)}))}processMicrotaskQueue(){const e=performance.now();let s=0;for(;this.queue.length>0&&s<this.CHUNK_SIZE;){const t=this.queue.shift();try{t()}catch(i){console.warn("UpdateQueue task error:",i)}if(s++,performance.now()-e>this.TIME_BUDGET)break}this.queue.length>0?Promise.resolve().then(()=>this.processMicrotaskQueue()):this.isProcessing=!1}processQueue(e){this.rafId=null;let s=0;for(;this.queue.length>0&&s<this.CHUNK_SIZE;){const t=this.queue.shift();try{t()}catch(i){console.warn("UpdateQueue task error:",i)}if(s++,performance.now()-e>this.TIME_BUDGET)break}this.queue.length>0?this.rafId=requestAnimationFrame(t=>this.processQueue(t)):this.isProcessing=!1}destroy(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.queue=[],this.isProcessing=!1}}