2012-10-15 6 views
7

नामक फ़ंक्शन के लिए सुनो मेरे पास निम्न कार्य हैं जिन्हें कुछ डेटा लोड करने के लिए हर 2 सेकंड कहा जाता है। यह प्रतिक्रिया के साथ सामान करने के लिए funcion [करते हैं] रजिस्टर करता है। (उदाहरण सरलीकृत है)।जावास्क्रिप्ट

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: function (response) {do(response)} }); 
} 

function do (text){ 
    var i = setInterval(doRequest, 2000); 
} 

मुझे आश्चर्य है कि अगर वहाँ किसी भी तरह से है कि मैं एक समारोह है कि हर बार [कर] समारोह बाहर कर समारोह अंदर श्रोता के लिए एक कॉल को जोड़ने के लिए की आवश्यकता होगी, के साथ कहा जाता है कहा जाता है बना सकते हैं। अग्रिम में धन्यवाद। यदि jquery के साथ ऐसा करने का कोई बेहतर तरीका है, तो प्लगइन की तरह मैं मदद की सराहना करता हूं।

[संपादित करें] विचार यह नहीं है कि यह काम करता है या नहीं। मेरा सवाल इस बारे में था कि क्या मैं "डू" फ़ंक्शन में एक कस्टम श्रोता जोड़ सकता हूं जिसे पहले ही लागू किया गया था। AddActionListener ("do", "after", doSomeThingElse) की तरह कुछ तो मैं कार्य पूरा होने के ठीक बाद कुछ और कर सकता था।

+1

'2000' = 2 सेकंड 2 मिनट नहीं। सेटइंटरवाल में आपके पास मिली मिली सेकंड है .. यह सिर्फ एक टिप्पणी है –

+3

अपने फ़ंक्शन 'do' का नाम न दें। 'do' जावास्क्रिप्ट में एक आरक्षित शब्द है। –

+1

और वैसे, 'setInterval' के तर्कों को फ़्लिप करने की आवश्यकता है - फ़ंक्शन पहले आता है, फिर मिलीसेकंड: https://developer.mozilla.org/en-US/docs/DOM/window.setInterval – Ian

उत्तर

5

आप के रूप में यह है मौजूदा कोड को बनाए रखना चाहते हैं, तो आप एक और समारोह है जो बदले में कॉल do() और अपने नए समारोह में do() लपेट सकता है (जैसे कि do_this_as_well())।

आरक्षित कीवर्ड do के आसपास भ्रम से बचने के लिए नीचे दिए गए उदाहरण को देखें (मैंने do()do_this() का नाम बदल दिया है)। यह काम करता है क्योंकि ग्लोबल फ़ंक्शंस उनमें कुछ भी नहीं है लेकिन उनमें फ़ंक्शन ऑब्जेक्ट्स के साथ चर हैं।इन चरों को ओवरराइट किया जा सकता है, इस मामले में पुराने एक को कॉल करने वाले नए फ़ंक्शन के साथ:

function do_this(response) { ... } 

(function() 
{ 
    var previous=do_this; 
    do_this=function(response) { previous(response); do_this_as_well(); } 
})(); 
+0

आप पहले फ़ंक्शन को ओवरवेट कर रहे हैं और उसी पुराने कार्यक्षमता को एक नए में लपेट रहे हैं जिसके साथ मुझे कॉल करने की आवश्यकता होगी; क्या यह AJAX कॉलबैक से संदर्भ रखेगा? – jaxkodex

+0

यह जानने के बिना कि आप वास्तव में क्या कर रहे हैं, बिना कहने के लिए मुश्किल है, आप कहते हैं कि आपका उदाहरण सरलीकृत है। लेकिन यदि आप एक प्रतिक्रिया प्रतिक्रिया पैरामीटर पास करते हैं, तो यह पैरामीटर अग्रेषित किया जाएगा। –

+0

मुझे समझ में आया कि यह इसे ओवरराइट करेगा, और उदाहरण (जैसा कि यह है) जब भी AJAX अनुरोध सफल होता है तो willo_this 'फ़ंक्शन को कॉल करने में काम करेगा। यह Sence बनाता है, विशेष रूप से जब से आप जोड़ा क्यों। क्या मुझे यह सही मिला? – jaxkodex

1

साथ

success: function(response) { do(response); do_this_as_well(); } 
+0

तो, फ़ंक्शन में पहले से बनाए गए श्रोता को जोड़ने का कोई तरीका नहीं है? – jaxkodex

+0

मैं देखता हूं। मुझे लगता है कि आप किसी अन्य फ़ंक्शन में() को लपेट सकते हैं, जो श्रोता की तरह काम करेगा, लेकिन जावास्क्रिप्ट जो भी आप चाहते हैं वह मूल रूप से प्रदान नहीं करता है। –

+0

मुझे लगता है कि समाधान, AJAX अनुरोध से सफलता कॉलबैक को संशोधित करना होगा। रनटाइम में ऐसा करने का कोई तरीका है (मैं कोड नहीं बदल सकता) - रास्ते के उत्तर के लिए धन्यवाद। – jaxkodex

6

प्रथम बदलें

, अपने सरलीकृत संस्करण काम नहीं करेगा, क्योंकि आप इसे कॉल करने के बजाय do समारोह में उत्तीर्ण होना चाहते हैं।

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: _do }); 
} 

लेकिन यह आप की तरह कैसे कुछ अन्य कोड हर बार do शुरू हो जाती है चलाने के लिए पूछ रहे हैं लगता है।

तो do केवल doRequest() समारोह के अंदर शुरू हो जाती है, तो बस को उस अज्ञात फ़ंक्शन सही समय पर do का आह्वान करने के लिए अपने अन्य कोड जोड़ें।

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: function(response) { 
      // Run your other code 
      // or invoke another function. 
      _do(response); 
    } }); 
} 

आप इसे और अधिक सामान्यीकृत होना चाहते हैं, तो आप एक समारोह डेकोरेटर एक समारोह जो कुछ अन्य कोड के बाद do invokes देता है कि बना सकते हैं।

function doFactory(fn) { 
    return function() { 
     fn.apply(this, arguments); 
     _do.apply(this, arguments); 
    } 
} 

तो इस तरह के कार्यों बनाने:

var doFoo = doFactory(function() { 
    console.log("foo"); 
}); 

तो आपकी आवश्यकता response का एक पूर्व प्रसंस्करण के अधिक विशिष्ट है, तो आप इसे इस तरह फिर से काम कर सकते हैं:

function doFactory(fn) { 
    return function(response) { 
     _do.call(this, fn.call(this, response)); 
    } 
} 

फिर fn हेरफेर करें और response पर वापस आएं।

var doFoo = doFactory(function(response) { 
    return response + "foo"; 
}); 
+0

एक ही कोड के साथ काम करने की कोशिश करने का तरीका, इसलिए मेरा प्रश्न "eventListener" – jaxkodex

+0

@jaxkodex जोड़ने के बारे में अधिक था: आपके संपादन के संबंध में, आप सीधे 'do' * को संशोधित नहीं कर सकते हैं (कम से कम कुछ हैकिश के बिना .toString() 'और' eval' चालें) * या कुछ घटनाओं को इसके आमंत्रण में बांधें। लेकिन आप * किसी अन्य कार्य में आसानी से 'do' लपेट सकते हैं जो कुछ अन्य काम करता है। इसके लिए कई दृष्टिकोण हैं। –

संबंधित मुद्दे