backburner.js 
A rewrite of the Ember.js run loop as a generic microlibrary.
TL;DR
A priority queue that will efficiently batch, order, reorder and process work; done via scheduling work on specific queues.
Downloads
API
Constructor, Constructor, Description, ---, ---, new Backburner(), instantiate a Backburner instance with an array of queue names, ### Instance methods, Method, Description, ---, ---, Backburner#run, execute the passed function and flush any deferred actions, Backburner#defer, defer the passed function to run inside the specified queue, Backburner#deferOnce, defer the passed function to run inside the specified queue, only execute it once, Backburner#setTimeout, execute the passed function in a specified amount of time, Backburner#debounce, execute the passed function in a specified amount of time, reset timer upon additional calls, Backburner#throttle, rate-limit the passed function for a specified amount of time, Backburner#cancel, cancel a deferOnce, setTimeout, debounce or throttle, Backburner#on, Add an event callback. Supports the following events: begin - Fires whenever the runloop begins. Callbacks are passed the current instance and the previous instance.end - Fires whenever the runloop ends. Callbacks are passed the current instance and the next instance., Backburner#off, Removes an event callback, Backburner#join, Join the passed method with an existing queue and execute immediately, if there isn't one use Backburner#run, Backburner#getDebugInfo, Returns debug information for counters, timers and queues, which includes surfacing the stack trace information for the respective calls, #### Alias, Alias, Description, ---, ---, Backburner#schedule, same as defer, Backburner#scheduleOnce, same as deferOnce, Backburner#later, same as setTimeout, ## Example usage
The following code will only cause a single DOM manipulation:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Backburner demo</title>
</head>
<body>
<div id="name"></div>
<script type="module">
import Backburner from './dist/es6/backburner.js'
var backburner = new Backburner(['render']),
person = {name: 'Erik'};
function updateName() {
document.querySelector('#name').innerHTML = person.name;
}
function setName(name) {
person.name = name;
backburner.deferOnce('render', updateName);
}
backburner.run(function() {
setName('Kris');
setName('Tom');
setName('Yehuda');
});
</script>
</body>
</html>