I've two versions of promise code. The page is a simple one - an unordered list with a few items. I am trying to make the items show up (fadeIn
) one-after-another sequentially. This exercise is done to sort of explain people what promises are...
Version 1:
$('li').hide();
var fadeInFunc = function (obj) {
var deferred = $.Deferred();
obj.fadeIn('slow', function () {
deferred.resolve();
});
return deferred.promise();
};
var funcWrapper = function (obj) {
return function(){
return fadeInFunc(obj);
};
};
$('input').click(function () {
fadeInFunc($('#li1'))
.then(funcWrapper($('#li2')))
.then(funcWrapper($('#li3')));
});
Version 2:
$('li').hide();
var fadeInFunc = function (obj) {
var deferred = $.Deferred();
obj.fadeIn('slow', function () {
deferred.resolve();
});
return deferred;
};
var execute = function () {
return fadeInFunc(this);
};
$('input').click(function () {
fadeInFunc($('#li1'))
.then(execute.bind($('#li2')))
.then(execute.bind($('#li3')));
});
Both work fine. However, I want someone to dive in and try to understand the code better. Moreover, this code becomes unmanageable when you have variable number of li
elements.
Here is the version for variable number of li
elements:
var liCount = Math.floor(Math.random() * 6) + 1;
$('p').html('liCount: ' + liCount);
var ul = $('ul');
for(var i = 0; i< liCount; i++){
ul.append('<li>Item ' + (i+1) + '</li>');
}
var liArray = $('li').hide();
var fadeInFunc = function (obj) {
var deferred = $.Deferred();
obj.fadeIn('slow', function () {
deferred.resolve();
});
return deferred;
};
var funcWrapper = function(o){
return function() { return fadeInFunc(o); };
};
$('input').click(function () {
var prev;
liArray.each(function(idx, obj){
var o = $(obj);
if(idx === 0){
prev = fadeInFunc(o);
}
else{
prev = prev.then(funcWrapper(o));
}
});
});