2012-04-27 7 views
6

Czytam obiekt odroczony w jQuery. Czy ktokolwiek mógłby mi powiedzieć, jaka jest różnica między następującymi dwiema metodami wywoływania?

  1. $.when.apply(null, a method).done(function(){success callback})
  2. $.when.(a method).done(function(){success callback})

I jakiego rodzaju przypadkach nadają się do pierwszego sposobu powyżej?

Z góry dziękuję.

Odpowiedz

16

$.when.apply(null, a method) ma sens tylko jeśli metoda jest rzeczywiście tablicą lub metoda wezwanie powrocie tablicę. Potem jest jak $.when(elements, of, the, array). See MDN w celu uzyskania szczegółowego opisu metody apply.

$.when.(a method) nie ma sensu, ale domyślam się, że miałeś na myśli $.when(a method). W tym przypadku, metoda musi być metodą zwracania obiektu odroczonego lub zmiennej, która wskazuje obiekt odroczony.

Składnia $.when() jest $.when(one, or, more, deferreds) - więc jeśli chcesz przekazać wiele deferreds które są w tablicy, trzeba .apply() ponieważ nie chcą budować wywołanie metody jako ciąg i używać eval (co jest rzeczywiście zło w tym przypadku).

+0

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

+0

+1 dla $ .when.apply (null, metoda) – marverix

1

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 
});