AJAX के अनुरोध को समय-समय पर कैसे फायर करें?


113
<meta http-equiv="Refresh" Content="5">

यह स्क्रिप्ट प्रत्येक 5 सेकंड के बाद पृष्ठ को फिर से लोड या ताज़ा करती है। लेकिन मैं इसे jQuery और AJAX कॉल का उपयोग करके करना चाहता हूं। क्या यह संभव है?

जवाबों:


281

जैसा कि अन्य लोगों ने बताया है कि सेटवर्क और सेटटाइमआउट ट्रिक करेंगे। मैं एक और अधिक उन्नत तकनीक को उजागर करना चाहता था जो मैंने पॉल आयरिश द्वारा इस उत्कृष्ट वीडियो से सीखा था: http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/

आवधिक कार्यों के लिए जो दोहराने के अंतराल से अधिक समय लग सकता है (जैसे एक धीमे कनेक्शन पर HTTP अनुरोध) इसका उपयोग न करना सबसे अच्छा है setInterval()। यदि पहला अनुरोध पूरा नहीं हुआ है और आप एक और शुरू करते हैं, तो आप उस स्थिति में समाप्त हो सकते हैं जहां आपके पास कई अनुरोध हैं जो साझा संसाधनों का उपभोग करते हैं और एक-दूसरे को भूखा रखते हैं। अंतिम अनुरोध पूरा होने तक अगले अनुरोध को शेड्यूल करने के लिए आप इस समस्या से बच सकते हैं:

// Use a named immediately-invoked function expression.
(function worker() {
  $.get('ajax/test.html', function(data) {
    // Now that we've completed the request schedule the next one.
    $('.result').html(data);
    setTimeout(worker, 5000);
  });
})();

सादगी के लिए मैंने शेड्यूलिंग के लिए सफलता कॉलबैक का उपयोग किया। इसका एक पक्ष यह है कि असफल अनुरोध अपडेट को रोक देगा। इससे बचने के लिए आप इसके बजाय पूर्ण कॉलबैक का उपयोग कर सकते हैं:

(function worker() {
  $.ajax({
    url: 'ajax/test.html', 
    success: function(data) {
      $('.result').html(data);
    },
    complete: function() {
      // Schedule the next request when the current one's complete
      setTimeout(worker, 5000);
    }
  });
})();

3
यह एक पुनरावर्ती फ़ंक्शन कॉल की तरह नहीं है? यदि हाँ, तो क्या इसे लंबे समय तक और अधिक समय तक चलने देना ठीक है, क्योंकि यह पुनरावर्ती है? जब तक अजाक्स सफलतापूर्वक क्रियान्वित होता रहता है, तब तक अनंत पुनरावृत्ति का मामला हो सकता है
राहुल डोले

1
इसके अलावा, यदि आप सेटटाइमआउट का उपयोग करते हैं, तो क्या इस कोड-ब्लॉक के बाहर से इस धागे को रोकने का कोई तरीका है? SetInterval की तरह, आप बस clearInterval () कॉल कर सकते हैं।
राहुल डोले

16
@RahulDole यह एक अच्छा प्रश्न है लेकिन यह पुनरावर्ती नहीं है। इसे सीधे वर्कर फंक्शन से नहीं बुलाया जाता है, इसलिए स्टैक बढ़ता नहीं रहेगा। अपने दूसरे बिंदु के लिए, सेटटाइमआउट के लिए डॉक्स चेकआउट करें () और आप देखेंगे कि यह एक संख्यात्मक आईडी देता है जिसे क्लियर टाइमआउट () में पारित किया जा सकता है।
आकर्षित किया

7
@RahulDole अगर आप किसी फ़ंक्शन के कॉल स्टैक को देखने के लिए कंसोल.trace () के साथ क्रोम प्ले में हैं। सेटटाइमआउट () द्वारा लागू किए गए फ़ंक्शंस में बहुत कम स्टैक होगा और इसमें निश्चित रूप से फ़ंक्शन शामिल नहीं होगा जिसे सेटटाइमआउट () कहा जाता है।
आकर्षित किया

1
@ अनूपल सिर्फ एक नया प्रश्न बनाते हैं।
आकर्षित किया

34

हां, आप कोड को लागू करने के लिए जावास्क्रिप्ट setTimeout()विधि या setInterval()विधि का उपयोग कर सकते हैं जिसे आप चलाना चाहते हैं। यहां बताया गया है कि आप इसे सेटटाइमआउट के साथ कैसे कर सकते हैं:

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

1
बस सेटटाइमआउट (निष्पादित करें, 5000) का उपयोग करें; सेटटाइमआउट ('एग्जीक्यूटिक्यू ()', 5000) के बजाय; - यह छोटा और तेज है।
rsp

4

आप उपयोग कर सकते हैं setTimeoutया setInterval

अंतर यह है - setTimeout आपके फ़ंक्शन को केवल एक बार चलाता है, और फिर आपको इसे फिर से सेट करना होगा। setInterval बार-बार अभिव्यक्ति को ट्रिगर करता रहता है, जब तक आप इसे रोकने के लिए नहीं कहते हैं


1

मैंने नीचे दिए गए कोड की कोशिश की,

    function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

यह निर्दिष्ट अंतराल के लिए अपेक्षित के रूप में काम नहीं किया, पृष्ठ पूरी तरह से लोड नहीं हुआ और फ़ंक्शन को लगातार कहा गया। नीचे के रूप में एक अलग समारोह में setTimeout(executeQuery, 5000);बाहर कॉल करने के लिए बेहतर है executeQuery(),

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  updateCall();
}

function updateCall(){
setTimeout(function(){executeQuery()}, 5000);
}

$(document).ready(function() {
  executeQuery();
});

इसने ठीक वैसे ही काम किया जैसा इरादा था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.