Вот для чего Buffer
:
var Buffer = function(handler) {
var tasks = [];
// empty resolved deferred object
var deferred = $.when();
// handle the next object
function handleNextTask() {
// if the current deferred task has resolved and there are more tasks
if (deferred.isResolved() && tasks.length > 0) {
// grab a task
var task = tasks.shift();
// set the deferred to be deferred returned from the handler
deferred = handler(task);
// if its not a deferred object then set it to be an empty deferred object
if (!(deferred && deferred.promise)) {
deferred = $.when();
}
// if we have tasks left then handle the next one when the current one
// is done.
if (tasks.length > 0) {
deferred.done(handleNextTask);
}
}
}
// appends a task.
this.append = function(task) {
// add to the array
tasks.push(task);
// handle the next task
handleNextTask();
};
};
Затем мы просто создаем обработчик задачи для анимации, задачу анимации и добавляем задачи в буфер.
function handleAnimation(task) {
var def = $.Deferred();
$(task.id).animate(task.props, task.timeout, task.options function() {
def.resolve();
});
return def.promise();
}
function AnimationTask(id, props, timeout, options) {
this.id = id;
this.props = props;
this.timeout = timeout;
this.options = options;
}
var buffer = new Buffer(handleAnimation);
buffer.append(new AnimationTask("#art1", {
"width": "1000px"
}, 1000, "linear");
buffer.append(new AnimationTask("#art2", {
"width": "1000px"
}, 1000, "linear");
buffer.append(new AnimationTask("#art3", {
"width": "1000px"
}, 1000, "linear");
Здесь используется магия jQuery, отложенная для запуска задач одна за другой.Вероятно, гораздо проще просто их связать.
Также это будет работать:
(function(callback){
$('#art1').animate({'width':'1000px'},1000, function() {
callback();
});
})((function(callback2){
$('#art2').animate({'width':'1000px'},1000, function() {
callback2();
});
})(function(){
$('#art3').animate({'width':'1000px'},1000);
}));