UNPKG

aurelia-binding

Version:

A modern databinding library for JavaScript and HTML.

75 lines (65 loc) 2.24 kB
import {PLATFORM} from 'aurelia-pal'; const queue = []; // the connect queue const queued = {}; // tracks whether a binding with a particular id is in the queue let nextId = 0; // next available id that can be assigned to a binding for queue tracking purposes let minimumImmediate = 100; // number of bindings we should connect immediately before resorting to queueing const frameBudget = 15; // milliseconds allotted to each frame for flushing queue let isFlushRequested = false; // whether a flush of the connect queue has been requested let immediate = 0; // count of bindings that have been immediately connected function flush(animationFrameStart) { const length = queue.length; let i = 0; while (i < length) { const binding = queue[i]; queued[binding.__connectQueueId] = false; binding.connect(true); i++; // periodically check whether the frame budget has been hit. // this ensures we don't call performance.now a lot and prevents starving the connect queue. if (i % 100 === 0 && PLATFORM.performance.now() - animationFrameStart > frameBudget) { break; } } queue.splice(0, i); if (queue.length) { PLATFORM.requestAnimationFrame(flush); } else { isFlushRequested = false; immediate = 0; } } export function enqueueBindingConnect(binding) { if (immediate < minimumImmediate) { immediate++; binding.connect(false); } else { // get or assign the binding's id that enables tracking whether it's been queued. let id = binding.__connectQueueId; if (id === undefined) { id = nextId; nextId++; binding.__connectQueueId = id; } // enqueue the binding. if (!queued[id]) { queue.push(binding); queued[id] = true; } } if (!isFlushRequested) { isFlushRequested = true; PLATFORM.requestAnimationFrame(flush); } } export function setConnectQueueThreshold(value) { minimumImmediate = value; } export function enableConnectQueue() { setConnectQueueThreshold(100); } export function disableConnectQueue() { setConnectQueueThreshold(Number.MAX_SAFE_INTEGER); } export function getConnectQueueSize() { return queue.length; }