2011-03-23 17 views
7

मुझे AJAX तेज और कार्यात्मक बनाने में समस्या हो रही है। मैं एक ajax भेज रहा और आगे की प्रक्रिया के लिए दिए गए डेटा की जरूरत हैjQuery अजाक्स: * async * अनुरोध सफलता तक जारी होने तक प्रतीक्षा कैसे करें?

function blah1(arg1){//arg1 is an array, roughly 10 elements 

var arr[]; 

$.each(arg1, function(i){ 
//blah code 

    $.ajax({ 
     //blah options 
     async: true, 
     success: function(data){ 
      arr[i] = data.someInt; 
     }//end success 
    });//end ajax 
}//end each 

return arr; 
}//end function 

असल में,: यहाँ छद्म/प्रोटोटाइप कोड है।

यदि मैं सच में async सेट करता हूं, तो फ़ंक्शन तुरंत खाली 'arr' सरणी देता है, इस प्रकार पूरी स्क्रिप्ट विफल हो जाती है। लेकिन अगर मैं झूठ बोलने के लिए async सेट करता हूं, तो यह काम करता है, लेकिन बहुत लंबा लगता है।

मैंने यह $.ajaxQueue(); चीज़ देखी है, लेकिन स्पष्ट रूप से मुझे यह बिल्कुल समझ में नहीं आता है, और मुझे नहीं पता कि यह काम करेगा या नहीं।

तो सवाल यह है कि, सबसे पहले, क्या कोई तरीका है कि मैं एक ही समय में सभी एजेक्स अनुरोधों को अतुल्यकालिक रूप से भेज सकता हूं और सभी AJAX किए जाने के बाद फ़ंक्शन प्रतीक्षा करें और वापस लौटें []। यदि नहीं, तो AJAXQueue मेरे मामले में काम करेगा? (किसी न किसी उदाहरण कृपया?)

+0

क्या आप इसे एक ही AJAX अनुरोध में नहीं भेज सकते हैं और सभी 10ish उत्तरों के परिणामों को पार्स कर सकते हैं? – Peeter

+0

यह संभव है, लेकिन इसका मतलब है कि मुझे सर्वर की तरफ संपादन करना होगा और यह मेरे लिए गोता लगाने के लिए एक पूरी गड़बड़ है। मैं इसे jQuery पर करना पसंद करूंगा। – JQonfused

+0

1 अनुरोध बेहतर है तो 10+ अनुरोध। आप ब्राउज़र अनुरोध सीमा को मारने को समाप्त कर देंगे। – Peeter

उत्तर

4

आप अजाक्स कॉल सिंक्रोनस बना सकते हैं जिसे आप जानते हैं, व्यक्तिगत रूप से मैं अपने कोड को फिर से कारगर कर सकता हूं ताकि AJAX कॉल की सफलता विधि, फिर किसी अन्य फ़ंक्शन पर कॉल को ट्रिगर कर दे।

$.ajax({ 
     //blah options 
     async: true, 
     success: function(data){ 
      arr[i] = data.someInt; 
      myCall(arr[i]); 
     }//end success 
    });//end ajax 
5

का उपयोग jQuery 1.5 आस्थगित की मैं इस के लिए चुनते हैं:

function blah1(arr, callback){ 
    $.when($.map(arr, function(val, i){ 
     $.ajax({ 
      //blah options 
      async: true 
     }); 
    }).toArray()).then(function(resultsArr) { 
     callback(resultsArr); 
    }); 
} 

समस्या आप async ajax कॉल समाप्त करने से पहले अपने समारोह में सरणी वापस जाने के लिए कोशिश कर रहे थे। यह वास्तव में संभव नहीं है इसलिए आपको ब्लाह को कॉलबैक पास करने की आवश्यकता होगी।

आप यहां क्या कर रहे हैं jqXHR ऑब्जेक्ट्स (जो स्थगित ऑब्जेक्ट्स हैं) पर ऑब्जेक्ट्स की अपनी सरणी मैपिंग कर रहा है। फिर स्थगित वस्तुओं की उस सरणी को $.when पर गुजरना।

$.when एक सरणी लेता है और फिर आपको .then फ़ंक्शन चलाने की अनुमति देता है जब संपूर्ण सरणी AJAX कॉल से लोड हो जाती है। आपके पास resultsArr आपके .then फ़ंक्शन के लिए तर्क के रूप में पास किया गया है।

यदि आप अपने AJAX सफलता कॉल में वापसी मान में हेरफेर करते हैं तो उसी कार्य में $.ajax और return का उपयोग करने का कोई तरीका नहीं है।

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