Odroczony został stworzony w celu wykonania kodu po odpowiedzi na niektóre zdalne wywołanie (np. Ajax).
więc można mieć:
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();
}
więc można iść:
load_conf(1).done(function (processed_data) {
do_something_with(processed_data);
});
Co wykonać jakiś kod po załadowaniu exacly 3 konfiguracje? Można zrobić coś takiego:
$.when(load_conf(1), load_conf(2), load_conf(3)).done(function (c1, c2 ,c3) {
console.log("configurations: ", c1, c2, c3);
})
ale co wykonywanie kodu po załadowaniu konfiguracji N gdzie N jest zmienna? W tym przypadku można użyć metody Function.prptotype.apply. Możesz przekazać jako pierwszy argument obiekt, który będzie traktowany jako "ten" wewnątrz funkcji. Drugi argument to lista parametrów, ale wewnątrz tablicy.
więc można iść tak:
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
});
patrz [MDN: 'fun.apply()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/ zastosuj) i [Eloquent JavaScript] (http://eloquentjavascript.net/chapter6.html#key5) – gnarf
+1 dla $ .when.apply (null, metoda) – marverix