2010-03-30 14 views
15

हमारे पास हमारे कोड में यह अनाम कार्य है, जो jQuery के अजाक्स ऑब्जेक्ट पैरामीटर का हिस्सा है और जो फ़ंक्शन से कुछ चर का उपयोग करता है उसे सेव किया जाता है।इस जावास्क्रिप्ट अज्ञात फ़ंक्शन को दोबारा कैसे करें?

this.invoke = function(method, data, callback, error, bare) { 
     $.ajax({ 
     success: function(res) { 
      if (!callback) return; 

      var result = ""; 
      if (res != null && res.length != 0) 
       var result = JSON2.parse(res); 

      if (bare) 
      { callback(result); return; } 

      for (var property in result) { 
       callback(result[property]); 
       break; 
      } 
     } 
    }); 
} 

मैंने अतिरिक्त कोड छोड़ा है, लेकिन आपको विचार मिलता है। कोड पूरी तरह से ठीक काम करता है, लेकिन यह आईई में प्रत्येक कॉल पर 4 केबीएस को रिसाव करता है, इसलिए मैं अज्ञात फ़ंक्शन को नामित एक में बदलने के लिए इसे पुन: सक्रिय करना चाहता हूं, जैसे .onSuccess = function (res) {..}।

समस्या यह है कि यह फ़ंक्शन this.invoke (..) से चर का उपयोग करता है, इसलिए मैं इसे अपने शरीर से बाहर नहीं ले सकता। मैं इस कोड को सही तरीके से कैसे प्रतिक्रिया दूं, ताकि अज्ञात फ़ंक्शंस और पैरेंट फ़ंक्शन वेरिएबल्स का उपयोग न करें?

अद्यतन। मैं एक अलग ऑब्जेक्ट बनाने के बारे में सोच रहा हूं, इसे उसी पैरामीटर के साथ शुरू कर रहा हूं, और jQuery पर अजाक्स ऑब्जेक्ट के पैरामीटर के रूप में इसके ऑनसेक्शन फ़ंक्शन को पास कर रहा हूं। हालांकि मुझे संदेह है कि यह अभी भी स्मृति को रिसाव करेगा।

अपडेट 2. मुझे कुछ लिंक मिलते हैं जो सुझाव देते हैं कि वास्तविक रिसाव jQuery के कारण हो सकता है। Simple jQuery Ajax call leaks memory in Internet Explorer Memory leak involving jQuery Ajax requests

फिर भी यह इस refactor करने के लिए एक रास्ता खोजने के लिए अच्छा था।

अपडेट 3. मैं उत्तर स्वीकार करने से पहले एक और सामान्य समाधान की प्रतीक्षा करूंगा।

+0

आप कैसे जानते हैं कि यह वास्तव में लीक हो रहा है, बनाम तुरंत एकत्र नहीं किया जा रहा है? आईई की रिसाव डीओएम तत्वों और घटना हैंडलरों के बीच परिपत्र संदर्भों के आसपास होती है, जिनमें से कोई भी यहां स्पष्ट रूप से मौजूद नहीं है। –

+0

आईई भी बंद होने पर रिसाव करता है, जो हमारे पास है। मैंने उपरोक्त कोड को डीबग किया है और मेरे ज्ञान से यह उन हिस्सों में से एक है जहां रिसाव होता है, क्योंकि कॉलबैक कुछ भी नहीं लेता है। (इस कोड पर सभी ब्राउज़र रिसाव निष्पक्ष होना)। –

उत्तर

10

आप ajax अनुरोध है कि सफलता कॉलबैक में पहुँचा जा सकता है के लिए अतिरिक्त परम जोड़ सकते हैं:

this.invoke = function(method, data, callback, error, bare) { 
    $.ajax({ 
     success: onSuccess, 
     invokedata: { 
     callback: callback, 
     bare: bare 
     } 
    }); 
}; 

var onSuccess = function(res) { 
    var callback = this.invokedata.callback, 
     bare = this.invokedata.bare; 
    if (!callback) return; 

    var result = ""; 
    if (res != null && res.length != 0) 
     var result = JSON2.parse(res); 

    if (bare){ 
     callback(result); 
     return; 
    } 

    for (var property in result) { 
     callback(result[property]); 
     break; 
    } 
} 
+0

नहीं पता था कि आप ऐसा कर सकते हैं, धन्यवाद। मैं यह देखने के लिए जांच करूंगा कि अभी भी रिसाव है या नहीं। –

+0

अनुसूचित जाति को कैसे पास किया जा रहा है? Jquery से – plodder

+0

। http://api.jquery.com/jQuery।AJAX/ –

4
उत्कृष्ट, उत्कृष्ट प्रश्न के लिए

+1 - मुझे आपका दर्द महसूस होता है - यह वास्तव में अच्छी तरह से फैक्टर है।

एक सुझाव (और हो सकता है कि आप अपने अपडेट के द्वारा यही मतलब है) ... ऑनसेफ के लिए एक रैपर परिभाषित करें और इसे उस कार्य को वापस कर दें जिसे आप असाइन करना चाहते हैं। फिर बाहरी फ़ंक्शन को कॉल करें और उसे "सफलता" विकल्प को असाइन करें, जिसकी कीमतों को इसकी आवश्यकता है। वे मान आंतरिक कार्य में चर के लिए पूर्व-आवंटित किए जाएंगे। वास्तव में सुनिश्चित नहीं हैं कि अगर यह मदद मिलेगी - आप अभी भी एक गुमनाम समारोह के साथ खत्म हो - लेकिन मूल्य की एक कोशिश

this.invoke = function(method, data, callback, error, bare) { 
    $.ajax({ 
     success: onSuccess(callback, bare); 
    }); 
}; 

var onSuccess = function(callback, bare) { 
    return function() { 
     if (!callback) return; 

     var result = ""; 
     if (res != null && res.length != 0) 
      var result = JSON2.parse(res); 

     if (bare) 
     { callback(result); return; } 

     for (var property in result) { 
      callback(result[property]); 
      break; 
     } 
    } 
} 
+2

यह एक प्रोग्रामिंग बिंदु दृश्य से एक अच्छा तरीका है, लेकिन यह रिसाव समस्या को सॉर्ट नहीं करता है, क्योंकि रिटर्न स्टेटमेंट में आपका अनाम फ़ंक्शन अभी भी पैरेंट फ़ंक्शन के चर के संदर्भों को संदर्भित करता है। –

+0

ठीक है..क्या मुझे डर था। अगर यह * वास्तव में * प्रत्येक AJAX कॉल के बाद अनाम कार्यों का निर्माण जो स्मृति रिसाव का कारण बनता है तो आप एक अचार में हैं। यह सुनिश्चित नहीं है कि यहां कचरा संग्रहण को रोकना क्या है - क्या आपने इसके साथ काम करते समय शारीरिक रूप से फ़ंक्शन को हटाने की कोशिश की है? – plodder

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