Backburner.js
A light weight queueing library.
Pavithra Kodmad
@PKodmad
Where is it from?
Microlib offshoot of Emberjs' internal run loop.
What Does it Do?
Gives you functionality to
- Combine/Reduce unnecessary invocations to an efficient subset
- Defer methods to be executed later and reliably.
- Define priority while scheduling methods.
- Some more sugar, like throttle, setTimeout and debounce.
Why?
DOM manipulations are expensive!!
Why?
Asynchrony
Everything good and bad in Front End Development
Asynchrony
Everything good and bad in Front End Development
Why?
More performance!
ScheduleOnce
Throttle
Debounce
How?
Prioritised queues!
var mybb = new backburner(['firstQ', 'secondQ', 'thirdQueue']);
mybb.run(function(){ mybb.scheduleOnce(queuename, target, method); mybb.schedule(queuename, target, method); });
app.TodoView = Backbone.View.extend({
// ...
initialize: function () {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
// do our DOM manipulations here. they'll get run many times :(
}
// ...
});
// triggers the view to rerender
model.set('firstName', 'Erik');
// triggers the view to rerender
model.set('lastName', 'Bryn');
app.TodoView = Backbone.View.extend({
// ...
initialize: function () {
this.listenTo(this.model, 'change', this.render);
},
render: function() {
// put the rerender on the backburner!
backburner.deferOnce('render', this, this.actuallyRender);
},
actuallyRender: function() {
// do our DOM manipulations here. will only be called once.
}
// ...
});
// ... somewhere in our app code ...
backburner.run(function() {
model.set('firstName', 'Erik'); //you can pass {silent:true} to supress change
model.set('lastName', 'Bryn');
});
// our view has been rerendered only once, thanks to backburner!
Using Backburner.
var queuenames = ['render', 'afterRender'];
var backburnerSim = new backburner.Backburner(queuenames);
var j = 0;
var person = {'name':'PK'};
var self = this;
document.getElementById('withBB').addEventListener('click', function(){
backburnerSim.run(function(){
document.getElementById('bodyc').innerHTML = '';
self.setName('Ini');
self.setName('Mini');
self.setName('Maini');
self.setName('Mo');
document.getElementById(name).style.color = red;
//self.changeNameColor('named');
});
});
function setName(name){
person.name = name;
backburnerSim.scheduleOnce('render', setDomName);
}
i=0;
function setDomName(){
console.log(i);
var div = document.createElement('div');
div.id = 'named';
div.innerHTML = person.name + i;
div.style.border = '1px solid black';
div.style.height = '100px';
div.style.width = '100px';
document.getElementById('bodyc').appendChild(div);
i++;
}
function actualColorChange(name){ elem = document.getElementById(name); elem.style["background-color"] = 'red'; } function changeNameColor(name){ var elem; backburnerSim.scheduleOnce('afterRender', this, actualColorChange, name); }
backburnerSim.run(function(){ document.getElementById('bodyc').innerHTML = ''; self.setName('Ini'); self.setName('Mini'); self.setName('Maini'); self.setName('Mo'); //document.getElementById(name).style.color = red; self.changeNameColor('named'); });http://jsbin.com/megaj/2/edit
Currently used by -
Ember.js
For the run loop implementation.
Backburner.js
By Pavithra Kodmad
Backburner.js
- 3,165