मैं एक वेब पेज सेट अप करना चाहता हूं जो एक एम्बेडेड वेब-सर्वर से AJAX कॉल के माध्यम से डेटा नमूना करता है। मैं कोड कैसे स्थापित करूं ताकि एक अनुरोध दूसरे को ओवरलैप न करे? मुझे जिक्र करना चाहिए कि मेरे पास बहुत कम जावास्क्रिप्ट अनुभव है और यह भी एक अनिवार्य कारण है कि किसी भी आकार के बाहरी पुस्तकालयों का उपयोग 10 या इतने किलोबाइट से बड़ा न हो।मैं ओवरलैप के बिना अंतराल पर अजाक्स कॉल कैसे करूं?
उत्तर
नाम के बावजूद AJAX, असीमित नहीं होना चाहिए।
यहाँ अतुल्यकालिक विधि
var req;
function ajax(method,url,payload,action)
{
if (window.XMLHttpRequest)
{
req = new XMLHttpRequest();
req.onreadystatechange = action;
req.open(method, url, true);
req.send(payload);
}
else if (window.ActiveXObject)
{
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req)
{
req.onreadystatechange = action;
req.open(method, url, true);
req.send(payload);
}
else
{
alert("Could not create ActiveXObject(Microsoft.XMLHTTP)");
}
}
}
function sjax(method,url,payload,action)
{
if (window.XMLHttpRequest)
{
req = new XMLHttpRequest();
req.open(method, url, false);
req.send(payload);
action();
}
else if (window.ActiveXObject)
{
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req)
{
req.onreadystatechange = action;
req.open(method, url, false);
req.send(payload);
}
else
{
alert("Could not create ActiveXObject(Microsoft.XMLHTTP)");
}
}
}
है ... ... लेकिन यहाँ एक तुल्यकालिक बराबर है ... ... और यहाँ एक ठेठ कार्रवाई है ...
function insertHtml(target)
{
var pageTarget = arguments[0];
if (req.readyState == 4) // 4 == "loaded"
{
if (req.status == 200) // 200 == "Ok"
{
if (req.responseText.indexOf("error") >= 0)
{
alert("Please report the following error...");
pretty = req.responseText.substring(req.responseText.indexOf("error"),1200);
pretty = pretty.substring(0,pretty.indexOf("\""));
alert(pretty + "\n\n" + req.responseText.substring(0,1200));
}
else
{
div = document.getElementById(pageTarget);
div.innerHTML = req.responseText;
dimOff();
}
}
else
{
alert("Could not retreive URL:\n" + req.statusText);
}
}
}
तुल्यकालिक अनुरोध वास्तव में सबसे अच्छा विचार नहीं हैं, मेरी राय में, वे शेष पृष्ठ को भी लॉक करते हैं .... लेकिन यह उपयोगकर्ता की आवश्यकताओं पर निर्भर करता है। jQuery $ .ajax दस्तावेज़ों से भी: "सिंक्रनाइज़ेशन आवश्यक होने पर अन्य तरीकों से उपयोगकर्ता इंटरैक्शन को अवरुद्ध करना बेहतर होता है।" –
मैं तुम्हें jx.js जैसे एक छोटे टूलकिट (source) का उपयोग सुझाव देते हैं। आप इसे यहाँ पा सकते हैं: http://www.openjs.com/scripts/jx/ (कम से कम 1k न्यूनतम किया गया)
सेट करने के लिएएक अनुरोध:
jx.load('somepage.php', function(data){
alert(data); // Do what you want with the 'data' variable.
});
स्टोर करने के लिए एक अंतराल आप setInterval
उपयोग कर सकते हैं और एक चर पर इसे सेट करने के लिए किया जाए या नहीं एक अनुरोध वर्तमान में उत्पन्न है - अगर यह है, हम सरल कुछ भी नहीं:
var activeRequest = false;
setInterval(function(){
if (!activeRequest) {
// Only runs if no request is currently occuring:
jx.load('somepage.php', function(data){
activeRequest = false;
alert(data); // Do what you want with the 'data' variable.
});
}
activeRequest = true;
}, 5000); // Every five seconds
अन्य उत्तर के समान ... तो अंतराल को बर्बाद क्यों करें, बल्कि सिंक्रोनस कॉल करें। मतदान द्वारा आप औसत अपशिष्ट 5000ms/2 पर बर्बाद करेंगे। – dacracot
आप केवल पिछली AJAX कॉल से एक सफल प्रतिक्रिया के बाद आपके AJAX अनुरोध दोबारा लॉन्च करने के विकल्प पर विचार कर सकते हैं।
function autoUpdate()
{
var ajaxConnection = new Ext.data.Connection();
ajaxConnection.request(
{
method: 'GET',
url: '/web-service/',
success: function(response)
{
// Add your logic here for a successful AJAX response.
// ...
// ...
// Relaunch the autoUpdate() function in 5 seconds.
setTimeout(autoUpdate, 5000);
}
}
}
यह उदाहरण ExtJS का उपयोग करता है, लेकिन आप बहुत आसानी से बस XMLHttpRequest
इस्तेमाल कर सकते हैं।
नोट: यदि आप एक्स सेकंड की एक सटीक अंतराल होना आवश्यक है हैं, तो आप समय था जब AJAX अनुरोध setTimeout()
कॉल करने के लिए शुरू किया गया था से पारित कर दिया पर नज़र रखने के लिए होता है, और उसके बाद से इस समयावधि घटाना विलंब। अन्यथा, उपर्युक्त उदाहरण में अंतराल का समय नेटवर्क विलंबता और वेब सेवा तर्क को संसाधित करने के समय के साथ अलग-अलग होगा।
बिल्कुल वही नहीं जो वे पूछ रहे थे, लेकिन एक बहुत अच्छा समाधान (केवल कॉलबैक का उपयोग करने के लिए) –
अच्छा जवाब। हालांकि आप पिछले अजाक्स कॉल के बाद शायद 'सेटटाइमआउट' करना चाहते हैं, भले ही यह सफल हो या नहीं। अन्यथा, पहली बार आपके पास टाइमआउट या त्रुटि हो, तो आप अपडेट प्राप्त करना बंद कर देंगे। – Grodriguez
स्टैक ओवरव्लो में आपका स्वागत है। महान पहला सवाल। – Sampson