Cuando funciones o devoluciones de llamada de finalización vez tienes anidados demasiado profundo o código está siendo repetido una y otra vez, tienden a pensar en una solución de tabla de datos con una función común:
function fadeSequence(list) {
var index = 0;
function next() {
if (index < list.length) {
$(list[index++]).fadeOut(next);
}
next();
}
var fades = ["div1", "div2", "div3", "div4", "div5"];
fadeSequence(fades);
Y, si deseaba un tipo diferente de animación para algunos de los elementos, podría crear una matriz de objetos que describan qué se supone que es cada animación sucesiva. Podría poner tantos detalles en la matriz de objetos como sea necesario. Puede incluso animaciones entremezclados con otro método jQuery sincrónica llamadas como esta:
function runSequence(list) {
var index = 0;
function next() {
var item, obj, args;
if (index < list.length) {
item = list[index++];
obj = $(item.sel);
args = item.args.slice(0);
if (item.sync) {
obj[item.type].apply(obj, args);
setTimeout(next, 1);
} else {
args.push(next);
obj[item.type].apply(obj, args);
}
}
}
next();
}
// sequence of animation commands to run, one after the other
var commands = [
{sel: "#div2", type: "animate", args: [{ width: 300}, 1000]},
{sel: "#div2", type: "animate", args: [{ width: 25}, 1000]},
{sel: "#div2", type: "fadeOut", args: ["slow"]},
{sel: "#div3", type: "animate", args: [{ height: 300}, 1000]},
{sel: "#div3", type: "animate", args: [{ height: 25}, 1000]},
{sel: "#div3", type: "fadeOut", args: ["slow"]},
{sel: "#div4", type: "fadeOut", args: ["slow"]},
{sel: "#div1", type: "fadeOut", args: ["slow"]},
{sel: "#div5", type: "css", args: ["position", "absolute"], sync: true},
{sel: "#div5", type: "animate", args: [{ top: 500}, 1000]}
];
runSequence(commands);
Y, esto es una demostración de trabajo de esta segunda opción: http://jsfiddle.net/jfriend00/PEVEh/
http://cdmckay.org/blog/2010/06/22/how-to-use-custom-jquery-animation-queues/ – Brad