2012-04-27 8 views
6

Sto leggendo l'oggetto posticipato in jQuery. Qualcuno potrebbe dirmi qual è la differenza tra seguire due modi di invocare?

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

E che tipo di casi sono in forma per il primo modo di cui sopra?

Grazie in anticipo.

risposta

16

$.when.apply(null, a method) senso solo se un metodo è in realtà una matrice o un metodo chiamata restituendo un array. Quindi è come un $.when(elements, of, the, array). See MDN per una descrizione dettagliata del metodo apply.

$.when.(a method) non ha alcun senso, ma suppongo che intendessi $.when(a method). In questo caso un metodo deve essere nuovamente un metodo chiamare restituendo un oggetto posticipato o una variabile che punta a un oggetto posticipato.

La sintassi di $.when() è $.when(one, or, more, deferreds) - quindi se si vuole passare più deferreds che sono in un array, è necessario .apply() dal momento che non vuole costruire la chiamata al metodo come una stringa e utilizzare eval (che è davvero il male in questo caso).

+0

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

+0

+1 per $ .when.apply (null, un metodo) – marverix

1

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