2012-11-18 27 views
5

संभव डुप्लिकेट:
passing index from for loop to ajax callback function (javascript)एक साथ जावास्क्रिप्ट xmlhttprequests को कैसे संभालें?

मैं कुछ सामग्री लाने में, XMLHttpRequests बनाने अलग सर्वरों के लिए, क्रम में के साथ थोड़ा उलझन में ve .. यहाँ , मैं क्या लिखा गया है है, लेकिन ऐसा लगता है कि मैं किसी बिंदु पर गलत महसूस कर रहा हूं ..

var URL = new Array(); 
URL[0] = "http://www.example1.com"; 
URL[1] = "http://www.example2.com"; 
URL[2] = "http://www.example3.com"; 
var nRequest = new Array(); 
for (var i=0; i<3; i++){ 
nRequest[i] = new XMLHttpRequest(); 
nRequest[i].open("GET", URL[i], true); 
nRequest[i].onreadystatechange = function (oEvent) { 
if (nRequest[i].readyState === 4) { 
if (nRequest[i].status === 200) { 
    console.log(nRequest[i].responseText); 
    alert(nRequest[i].responseText); 
} else { 
    console.log("Error", nRequest[i].statusText); 
} 
    } 
}; 
nRequest[i].send(null); 
} 

आईई 10 पर इस कोड के साथ मुझे पहुंच मिलती है कंसोल पर इनकार कर दिया ..

अगर मैं सरणी को हटाने और सरल अनुरोध का उपयोग, यह उम्मीद के रूप में संचालित ..

wRequest = new XMLHttpRequest(); 
wRequest.open("GET", "http://www.example1.com", true); 
wRequest.onreadystatechange = function (oEvent) { 
if (wRequest.readyState === 4) { 
if (wRequest.status === 200) { 
    console.log(wRequest.responseText); 
    alert(wRequest.responseText); 
} else { 
    console.log("Error", wRequest.statusText); 
} 
    } 
}; 
wRequest.send(null); 
} 

लेकिन आईएमआई कैसे एकाधिक 2-3 अनुरोधों को गति प्रदान करने, और अभी भी डेटा के साथ समस्या नहीं माना से निपटने .. ??

+3

आप किसी भिन्न डोमेन से डेटा पढ़ने के लिए AJAX का उपयोग नहीं कर सकते हैं। – SLaks

+0

मुझे एक टाइपो 'wURL' ->' URL ', एक बंद करने की समस्या' i' अज्ञात फ़ंक्शन और समान मूल नीति समस्या के अंदर दिखाई देती है। – Musa

+0

मुझे केवल एक डोमेन से डेटा क्यों मिलता है? – nikolas

उत्तर

11

समस्या (स्लीबेटमैन कवर क्रॉस-डोमेन समस्या को अनदेखा करना) यह है कि जब आपका तैयार राज्य परिवर्तन कॉलबैक निकाल दिया जाता है तो यह i वैरिएबल का उपयोग कर रहा है जिसमें लूप पूर्ण होने के बाद 3 होगा। एक तरीका यह है कि ठीक करने के लिए इस प्रकार है:

for (var i=0; i<3; i++){ 
    (function(i) { 
     nRequest[i] = new XMLHttpRequest(); 
     nRequest[i].open("GET", URL[i], true); 
     nRequest[i].onreadystatechange = function (oEvent) { 
     if (nRequest[i].readyState === 4) { 
      if (nRequest[i].status === 200) { 
       console.log(nRequest[i].responseText); 
       alert(nRequest[i].responseText); 
      } else { 
       console.log("Error", nRequest[i].statusText); 
      } 
     } 
     }; 
     nRequest[i].send(null); 
    })(i); 
} 

यह प्रत्येक पाश के लिए एक तत्काल लागू समारोह अभिव्यक्ति का परिचय यात्रा ऐसे समारोह के अंदर कोड है कि अपने स्वयं के i - जे एस बंद के जादू का मतलब है कि जब onreadystatechange समारोह कहा जाता है कि यह अज्ञात फ़ंक्शन के पैरामीटर i तक पहुंच जाएगा (भले ही वह कार्य पूरा हो गया हो), बाहरी क्षेत्र के i नहीं, इसलिए सही nRequest तत्व प्रत्येक बार संसाधित किया जाएगा।

इसके अलावा आपके पास .open() लाइन पर एक टाइपो था जहां आपने wURL[i] कहा था लेकिन URL[i] होना चाहिए था।

प्रतिक्रिया पाठ के साथ आप क्या करने की योजना बना रहे हैं, इस पर निर्भर करते हुए मुझे यकीन नहीं है कि आपको अनुरोधों की एक सरणी की आवश्यकता है: आप अजाक्स कोड को ऐसे फ़ंक्शन में समाहित कर सकते हैं जो यूआरएल और कॉलबैक फ़ंक्शन पैरामीटर के रूप में लेता है, और फिर लूप में उस फ़ंक्शन को कॉल करें ...

+1

जिसने चाल की .. !!! हाल ही में मुझे जेएस के दायरे के साथ एक और मामले पर मुद्दा था, और ऐसा लगता है कि मुझे फिर से सामना करना पड़ा ... बहुत बहुत धन्यवाद .. !!! – nikolas

+0

आपका स्वागत है। जो मैंने दिखाया है वह आपके मौजूदा कोड में इसे कम करने के लिए न्यूनतम परिवर्तन है, लेकिन पूरी चीज को ढूढ़ने के लिए अच्छे तरीके हैं (शायद मेरी राय में) - शायद इस प्रश्न के दायरे से बाहर। – nnnnnn

+0

टाइपो, मेरे मूल नाम को चर के हैंडलिंग की तुलना में मित्रवत दिखाई देने के लिए बस कोशिश कर रहा था ... मेरे शॉन टेक्स्ट के लिए, मैं सिर्फ मैशप एप्लिकेशन बनाने की कोशिश कर रहा हूं, जो 2-3 अलग-अलग साइटों से डेटा एकत्र करता है, और एकत्रित करता है प्रत्येक से कुछ विशिष्ट जानकारी .. यही कारण है कि मैंने सोचा कि यह एक सरणी का उपयोग करना बेहतर होगा .. – nikolas

0

XMLHttpRequests बनाने, करने के लिए विभिन्न सर्वरों

आप ऐसा नहीं कर सकते। XMLHttpRequest को केवल उस डोमेन से कनेक्ट करने की अनुमति है जिस पर पृष्ठ संबंधित है। इसे "समान मूल नीति" कहा जाता है।

Google "समान मूल नीति" या अधिक जानने के लिए यहां पर खोज करें।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, हालांकि, किसी कारण से, मुझे एक प्रतिक्रिया मिलती है, जब मैं एकल अनुरोध को ट्रिगर करता हूं .. – nikolas

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