Deferred wurde erstellt, um Code nach der Antwort eines Remote-Aufrufs (z. B. Ajax) auszuführen.
so könnten Sie haben:
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();
}
so könnten Sie gehen:
load_conf(1).done(function (processed_data) {
do_something_with(processed_data);
});
Was einige Code nach dem Laden exacly 3 Konfigurationen auszuführen? Sie könnten so etwas wie:
$.when(load_conf(1), load_conf(2), load_conf(3)).done(function (c1, c2 ,c3) {
console.log("configurations: ", c1, c2, c3);
})
Aber was einige Code ausgeführt wird, nachdem N-Konfigurationen geladen, wobei N variabel ist? Für diese Fälle können Sie die Function.prptotype.apply-Methode verwenden. Sie können als erstes Argument ein Objekt übergeben, das in der Funktion als "this" behandelt wird. Das zweite Argument ist die Liste der Parameter, aber innerhalb eines Arrays.
so können Sie so gehen:
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
});
See [MDN: 'fun.apply()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/ anwenden) & [Eloquentes JavaScript] (http://eloquentjavascript.net/chapter6.html#key5) – gnarf
+1 für $ .when.apply (null, eine Methode) – marverix