2012-04-27 9 views
6

Estoy leyendo el objeto diferido en jQuery. ¿Alguien podría decirme cuál es la diferencia entre seguir dos maneras de invocar?

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

Y qué tipo de casos son aptos para la primera forma de arriba?

Gracias de antemano.

Respuesta

16

$.when.apply(null, a method) sólo tiene sentido si un método es en realidad una matriz o un método llamada devuelve una matriz. Entonces es como un $.when(elements, of, the, array). See MDN para una descripción detallada del método apply.

$.when.(a method) no tiene ningún sentido, pero supongo que se refería a $.when(a method). En este caso , un método debe volver a ser un método llamada que devuelve un objeto diferido o una variable que apunta a un objeto diferido.

La sintaxis de $.when() es $.when(one, or, more, deferreds) - así que si quieres pasar múltiples deferreds que se encuentran en una matriz, que necesita .apply() ya que no quiere construir la llamada al método como una cadena y usar eval (que es de hecho evil en este caso).

+0

Ver [MDN: 'fun.apply()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/ aplicar) & [Eloquent JavaScript] (http://eloquentjavascript.net/chapter6.html#key5) – gnarf

+0

+1 por $ .when.apply (null, un método) – marverix

1

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