2012-03-20 18 views
6

मैंने एक फ़ंक्शन लिखा है जो jQuery का उपयोग करके एसिंक्रोनस अनुरोध करता है।असिंक्रोनस कॉलबैक

var Site = { 

    asyncRequest : function(url, containerId) {   
     $.ajax({ 
      url : url, 
      onSuccess: function(data){ 
       $(containerId).html(data); 
      } 
     }); 
    } 
} 

सिंटेक्स थोड़ा गलत हो सकता है क्योंकि मैं नोटपैड का उपयोग कर रहा हूं, लेकिन उम्मीद है कि आपको यह विचार मिल जाएगा।

Site.asyncRequest('someurl', container1); 
Site.asyncRequest('someurl', container2); 

दोनों अनुरोध सर्वर द्वारा भेजे गए और संसाधित:

मैं फ़ंक्शन को कॉल करें। दो प्रतिक्रियाएं वापस भेजी जाती हैं, जो मैं उम्मीद करता हूं। हालांकि, मैं कंटेनर 1 और कंटेनर 2 की अपेक्षा करता हूं कि दोनों अनुरोधों से प्रतिक्रियाएं हों।

समस्या यह है कि केवल अंतिम प्रतिक्रिया प्रदर्शित होती है और मैं यह नहीं समझ सकता कि क्यों। मुझे नहीं पता कि jQuery AJAX अनुरोध/प्रतिक्रियाओं का ट्रैक कैसे रखता है, इसलिए शायद यह एक समस्या है।

कहें कि मैं 5 या 10 अनुरोध करता हूं, jQuery AJAX कैसे जानता है कि किस प्रतिक्रिया के लिए कौन सा प्रतिक्रिया है और यह इसका ट्रैक कहां रखता है?

आप

+0

हाय, धन्यवाद। मैं पैरामीटर के रूप में फ़ंक्शन को पास करने का प्रयास कर सकता हूं और फिर उस फ़ंक्शन को ऑनस्यूसे से कॉल कर सकता हूं। मैं देखूंगा कि क्या मैं इसे काम करने के लिए प्राप्त कर सकता हूं। मेरी मुख्य चिंता यह है कि मैं आसानी से डीबग और ट्रैक नहीं कर सकता कि क्या हो रहा है। –

उत्तर

5

यह जावास्क्रिप्ट स्कॉइंग समस्या प्रतीत होता है। निम्नलिखित का प्रयास करें:

var Site = { 
    asyncRequest: function(url, containerId) { 
     (function(theContainer) { 
      $.ajax({ 
       url: url, 
       onSuccess: function(data) { 
        $(theContainer).html(data); 
       } 
      }); 
     })(containerId); 
    } 
}; 

यह प्रत्येक समारोह कॉल के लिए एक अलग गुंजाइश बनाता है, इसलिए वास्तविक मूल्य "theContainer" द्वारा की ओर इशारा प्रत्येक onSuccess गुमनाम समारोह के लिए अलग है।

+0

@ शेखहेरा, वास्तव में, कुछ हद तक अस्पष्ट कारण के लिए यह मामला नहीं है: '' .ajax'' विधि 'लेटर' की वर्तमान घटना के दौरान 'url'' पैरामीटर का उपयोग कर रहा है जबकि' कंटेनर आईडी '/ घटना के लूप में बाद में किसी अन्य घटना में 'कंटेनर'' मान का उपयोग किया जा रहा है। चूंकि जावास्क्रिप्ट एक एकल धागा है, इसलिए 'url'' पैरामीटर के लिए यह असंभव है कि हम जो भी चाहते हैं उसके अलावा कुछ भी हो। अगर हमें 'ssccess'' फ़ंक्शन का उपयोग करने के लिए आवश्यक है तो हमें केवल' 'url'' को फिर से गुंजाइश करना होगा। –

1

धन्यवाद यहाँ क्या हो रहा है की वजह से रास्ता है कि समारोह घोषित किया जाता है करने के लिए, एक भी बंद बनाया जा रहा है है। यहां "एक और उन्नत उदाहरण" देखें: http://skilldrick.co.uk/2010/11/a-brief-introduction-to-closures/

मूल रूप से, containerId को onSuccess अज्ञात फ़ंक्शन के सभी उदाहरणों के बीच साझा किया जा रहा है। मैंने इसका परीक्षण नहीं किया है, लेकिन मेरा मानना ​​है कि अगर आपने asyncRequestSite के बाहर फ़ंक्शन को परिभाषित किया है, तो यह काम करेगा।

इस समस्या के लिए एक और अधिक सुरुचिपूर्ण समाधान के रूप में, शायद कोई और बेहतर जवाब देगा।

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