Differito è stato creato per eseguire il codice dopo la risposta di alcune chiamate remote (ad esempio ajax).
modo si potrebbe avere:
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();
}
così si poteva andare:
load_conf(1).done(function (processed_data) {
do_something_with(processed_data);
});
Che dire per eseguire del codice dopo il caricamento exacly 3 configurazioni? Si potrebbe fare qualcosa di simile:
$.when(load_conf(1), load_conf(2), load_conf(3)).done(function (c1, c2 ,c3) {
console.log("configurations: ", c1, c2, c3);
})
Ma per quanto riguarda l'esecuzione del codice dopo il caricamento di configurazioni N, dove N è variabile? In questo caso è possibile utilizzare il metodo Function.prptotype.apply. È possibile passare come primo argomento un oggetto che verrà trattato come "questo" all'interno della funzione. Il secondo argomento è l'elenco di parametri ma all'interno di un array.
in modo da poter andare in questo modo:
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
});
fonte
2014-03-14 21:46:23
Sede [MDN: 'fun.apply()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/ apply) e [Eloquent JavaScript] (http://eloquentjavascript.net/chapter6.html#key5) – gnarf
+1 per $ .when.apply (null, un metodo) – marverix