2009-01-14 8 views
9

मैं जो जल्दी जल्दी में कई getJSON() कॉल का आह्वान jQuery कोड का एक टुकड़ा:jQuery गुंजाइश या रेस स्थिति

var table = $("table#output"); 
for (var i in items) { 
    var thisItem = items[i]; 
    $.getJSON("myService", { "itemID": thisItem }, function(json) { 
     var str = "<tr>"; 
     str += "<td>" + thisItem + "</td>"; 
     str += "<td>" + json.someMember + "</td>"; 
     str += "</tr>"; 
     table.append(str); 
    }); 
} 

जब मैं इस एक laggy सर्वर के विरुद्ध चलाने के लिए, तालिका के साथ आबादी वाले हो जाता है अपेक्षित json.someMember मान (वे आदेश से बाहर निकलते हैं: मुझे यह बुरा नहीं लगता), लेकिन thisItem कॉलम विभिन्न पुनरावृत्तियों से मूल्यों के अप्रत्याशित मिश्रण के साथ पॉप्युलेट किया गया है।

मुझे लगता है कि यह गुंजाइश और समय के साथ कुछ करने के लिए है - कॉलबैक फ़ंक्शन thisItem को व्यापक दायरे से पढ़ रहा है? क्या मैं सही हू? मैं इसे कैसे न होने दूँ?

मेरा वर्तमान वर्कअराउंड जेएसओएन सेवा के लिए अपने इनपुट की प्रतिलिपि वापस करने के लिए है - जो कम से कम कहने से असंतुष्ट है।

+0

धन्यवाद इस प्रश्न पूछने के लिए स्लिम। मुझे कुछ समस्याएं भी थीं (मुझे एसिंक्रोनस फ़ंक्शन रिटर्न के बारे में पता था, लेकिन यह सुनिश्चित नहीं है कि GetJSON को वापस कैसे सिग्नल करना है, वापसी स्थान को स्थान देने के लिए कौन सा स्थान)। –

उत्तर

12

लूप के कारण स्कोपिंग समस्या की तरह लगता है। इस प्रयास करें:

var table = $("table#output"); 
for (var i in items) { 
    var thisItem = items[i]; 
    $.getJSON("myService", { "itemID": thisItem }, (function(thisItem) { 
     return function(json) { 
      var str = "<tr>"; 
      str += "<td>" + thisItem + "</td>"; 
      str += "<td>" + json.someMember + "</td>"; 
      str += "</tr>"; 
      table.append(str); 
     } 
    })(thisItem)); 
} 

संपादित: सब मैंने किया था $.getJSON कॉलबैक करने के लिए गुंजाइश thisItem था।

+0

मुझे नहीं लगता कि यह jQuery के साथ काम करेगा। क्या जेसन इस इटैम चर के बजाय बंद होने में समाप्त नहीं होगा और एक त्रुटि का कारण बन जाएगा? – jacobangel

+1

सं। $ .getJSON आंतरिक कार्य पारित हो जाता है; वह जो "जेसन" पैरामीटर प्राप्त करता है। –

+0

ऐसा लगता है कि एक इलाज किया है (मुझे सभी ब्रेसिज़ सॉर्ट करने के बाद!)। धन्यवाद! – slim

3

जावास्क्रिप्ट स्कोप के लिए ब्लॉक का उपयोग नहीं करता है। दायरा केवल कार्यों पर आधारित है।

यदि आप एक नया दायरा चाहते हैं, तो आपको एक नया आंतरिक कार्य घोषित करना होगा और इसे तुरंत चलाएं, यह जावास्क्रिप्ट में एक नया दायरा बनाने का एकमात्र तरीका है।

var table = $("table#output"); 
for(var i in items) 
{ 
    (function(){ 
     var thisItem = items[i]; 
     $.getJSON("myService", { "itemID": thisItem }, function(json) 
     { 
      var str = "<tr>"; 
      str += "<td>" + thisItem + "</td>"; 
      str += "<td>" + json.someMember + "</td>"; 
      str += "</tr>"; 
      table.append(str); 
     }); 
    })(); 
} 
+0

मुझे यह समाधान पसंद है क्योंकि यह मुझे वर्टोज फ़ंक्शन हस्ताक्षर के बिना इस इटैम जैसे अधिक स्थानीय चर रखने की अनुमति देता है। – slim

+0

मजेदार तथ्य: इस प्रकार स्कीपिंग आमतौर पर योजना – Javier

+0

में लागू की जाती है, मैं एक और तरीका भूल गया, आप लाइब्रेरी से लूप का उपयोग कर सकते हैं, ये वास्तव में प्रत्येक पुनरावृत्ति पर निष्पादित करने के लिए ब्लॉक के रूप में कार्य करते हैं। JQuery में: $ .each (आइटम, फ़ंक्शन (i, आइटम) {...}); –

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