2010-04-22 11 views
16

यह जेएस लूप स्क्रिप्ट हमेशा jquery AJAX funciton के अंदर ui_item का अंतिम मान प्राप्त करती है। प्रत्येक पुनरावृत्ति के सही मूल्य को कैसे पकड़ सकता है?एक लूप समस्या के अंदर jQuery AJAX

for (var i = 0; i <= split_files_cb_value_holder.length - 1; i++){ 
    var split_values = split_files_cb_value_holder[i].split(':'); 

    ui_item = split_files_cb_value_holder[i]; 

    $.ajax({ 
     type: "POST", 
     url: "ds/index.php/playlist/check_folder", 
     data: "component_type="+$('#component_type').val()+"&value="+split_values[1], 
     success: function(msg) 
     { 
      console.log(ui_item); //ALWAYS GETS THE LAST VALUE 
     }, 
     error: function() 
     { 
      alert("An error occured while updating. Try again in a while"); 
     } 
    }); 

} 

धन्यवाद!

+0

ui_item इसे हल करने से पहले 'let' जोड़ें। – kamushin

उत्तर

42

समस्या यह है कि अनाम कॉलबैक विधि संदर्भ द्वारा ui_item चर को कैप्चर करती है। चूंकि केवल एक चर है, यह हमेशा वैरिएबल को जो भी सौंपा गया था उसे हमेशा प्राप्त करता है।

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

उदाहरण के लिए:

function doCheck(i) { 
    var split_values = split_files_cb_value_holder[i].split(':'); 

    var ui_item = split_files_cb_value_holder[i]; 

    $.ajax({ 
     type: "POST", 
     url: "ds/index.php/playlist/check_folder", 
     data: "component_type="+$('#component_type').val()+"&value="+split_values[1], 
     success: function(msg) 
     { 
      console.log(ui_item); //Don't always get the last value 
     }, 
     error: function() 
     { 
      alert("An error occured while updating. Try again in a while"); 
     } 
    }); 
} 

for (var i = 0; i < split_files_cb_value_holder.length; i++) 
    doCheck(i); 
+3

सुधार के लिए धन्यवाद, लेकिन मुझे एक छोटा नोट जोड़ने के लिए मजबूर होना लगता है। कभी-कभी इंटरनेट पर टोन को अच्छी तरह से नहीं बताया जाता है, और "* WRONG *" से शुरू होने वाली टर्से टिप्पणी प्राप्त करने के लिए कठोर लग रहा था। लेकिन, मुझे आपका जवाब देखने में खुशी हुई और सुधार की सराहना की। मुझसे +1 – awgy

+3

@awgy: मुझे खेद है; मैं आक्रामक होने का मतलब नहीं था। हालांकि, दो समान रूप से गलत उत्तरों (और एक> 100 के उपयोगकर्ता से एक) को देखते हुए, मैं दृढ़ता से गलत धारणा को दूर करना चाहता था। (और, मैं थक गया हूं) – SLaks

+0

बढ़िया, बहुत बहुत धन्यवाद –

-4

बारी async बंद है, यह समस्या मैं लगता है कि ठीक कर देंगे। मेरा मतलब यह है: async: false

+3

हां यह एक 'त्वरित और गंदा' फिक्स है जिससे ब्राउजर धीमी गति से लोड हो सकता है, यहां तक ​​कि लोडिंग को भी बाधित कर सकता है। – MadushM

+3

अद्यतन के रूप में: async false को jQuery 1.8 के रूप में बहिष्कृत किया गया है। http://api.jquery.com/jQuery.ajax/ – fldsofglry

+1

Async को बंद करना एक भयानक विचार है .... – Rob