Deferred se creó para ejecutar código después de la respuesta de una invocación remota (es decir, ajax).
lo que podría tener:
load_conf = function (user_id) {
var def = $.Deferred()
$("http://get_conf_data_url?user_id="+user_id).done(function (data) {
var processed_conf = do_something_with(data);
def.resolve(processed_conf);
})
return def.promise();
}
por lo que podría ir:
load_conf(1).done(function (processed_data) {
do_something_with(processed_data);
});
Qué punto de ejecutar algún código después de cargar exacly 3 configuraciones? Se podría hacer algo como:
$.when(load_conf(1), load_conf(2), load_conf(3)).done(function (c1, c2 ,c3) {
console.log("configurations: ", c1, c2, c3);
})
Pero ¿qué pasa con la ejecución de un código después de cargar configuraciones N donde N es variable? Para estos casos, puede usar el método Function.prptotype.apply. Puede pasar como primer argumento un objeto que se tratará como "this" dentro de la función. El segundo argumento es la lista de parámetros, pero dentro de una matriz.
lo que puede ir de esta manera:
var defs = [];
for (var i=1; i<=N; i++) {
defs.push(load_conf(i));
}
// here's the magic
$.when($,defs).done(function() {
console.log("All conf loaded: ", arguments);
// arguments contains N processed answers
});
Ver [MDN: 'fun.apply()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/ aplicar) & [Eloquent JavaScript] (http://eloquentjavascript.net/chapter6.html#key5) – gnarf
+1 por $ .when.apply (null, un método) – marverix