2012-04-27 7 views
6

Ich lese das verzögerte Objekt in jQuery. Könnte mir bitte jemand sagen, was ist der Unterschied zwischen zwei aufrufenden Weg?

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

Und welche Art von Fällen, die oben für die erste Art und Weise fit sind?

Vielen Dank im Voraus.

Antwort

16

$.when.apply(null, a method) ist nur sinnvoll, wenn Verfahren ist tatsächlich eine Anordnung oder ein Verfahren Anruf eine Anordnung zurückkehrt. Dann ist es wie ein $.when(elements, of, the, array). See MDN für eine detaillierte Beschreibung der apply Methode.

$.when.(a method) macht überhaupt keinen Sinn, aber ich denke, du meinst $.when(a method). In diesem Fall sollte eine Methode wieder eine Methode Aufruf sein, die ein verzögertes Objekt oder eine Variable zurückgibt, die auf ein verzögertes Objekt verweist.

Die Syntax von $.when() ist $.when(one, or, more, deferreds) - so, wenn Sie mehrere deferreds übergeben wollen, die in einem Array sind, müssen Sie .apply() da Sie und eval verwenden Sie nicht den Methodenaufruf als String bauen wollen (was in der Tat ist böse in diesem Fall).

+0

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

+0

+1 für $ .when.apply (null, eine Methode) – marverix

1

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