2012-04-27 15 views
6

मैं jQuery में स्थगित वस्तु पढ़ रहा हूं। क्या कोई मुझे बता सकता है कि निम्नलिखित दो invoking तरीके के बीच क्या अंतर है?

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

और मामलों की किस तरह से ऊपर पहला तरीका के लिए फिट कर रहे हैं?

अग्रिम धन्यवाद।

उत्तर

16

$.when.apply(null, a method) केवल भावना अगर एक विधि वास्तव में एक सरणी या एक विधि कॉल एक सरणी लौटने है बनाता है। फिर यह $.when(elements, of, the, array) जैसा है। apply विधि के विस्तृत विवरण के लिए See MDN

$.when.(a method) सब पर कोई मतलब नहीं है, लेकिन मुझे लगता है कि आप $.when(a method) मतलब है। इस मामले में एक विधि फिर से एक विधि होनी चाहिए कॉल एक स्थगित वस्तु या एक चर जो एक स्थगित वस्तु को इंगित करता है।

$.when() की वाक्य रचना $.when(one, or, more, deferreds) है - इसलिए यदि आप एक से अधिक deferreds जो एक सरणी में हैं पास करना चाहते हैं, तो आप .apply() जरूरत है, क्योंकि आप एक स्ट्रिंग के रूप विधि कॉल का निर्माण और eval का उपयोग करें (जो वास्तव में है नहीं करना चाहते इस मामले में बुराई)।

+0

सी [MDN: 'fun.apply()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/ लागू) और [सुवक्ता जावास्क्रिप्ट] (http://eloquentjavascript.net/chapter6.html#key5) – gnarf

+0

+1 $ .when.apply के लिए (शून्य, एक विधि) – marverix

1

कुछ दूरस्थ आमंत्रण (i.e .: AJAX) की प्रतिक्रिया के बाद कोड निष्पादित करने के लिए डिफर्ड बनाया गया था।

तो आप हो सकता है:

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

तो आप जा सकते हैं:

load_conf(1).done(function (processed_data) { 
    do_something_with(processed_data); 
}); 

के बारे में क्या exacly 3 विन्यास लोड करने के बाद कुछ कोड निष्पादित करने के लिए? एन विन्यास लोड हो रहा है जहां एन चर रहा है के बाद कुछ कोड को क्रियान्वित करने के बारे में

$.when(load_conf(1), load_conf(2), load_conf(3)).done(function (c1, c2 ,c3) { 
    console.log("configurations: ", c1, c2, c3); 
}) 

लेकिन क्या: आप की तरह कुछ कर सकता है? इन मामलों के लिए आप Function.prptotype.apply विधि का उपयोग कर सकते हैं। आप पहले तर्क के रूप में एक ऑब्जेक्ट पास कर सकते हैं जिसे फ़ंक्शन के अंदर "यह" माना जाएगा। दूसरा तर्क पैरामीटर की सूची है लेकिन एक सरणी के अंदर है।

तो आप इस तरह जा सकते हैं:

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