क्या जावास्क्रिप्ट में फ़ंक्शन को समय-समय पर कॉल करने का कोई तरीका है?


128

क्या जावास्क्रिप्ट में फ़ंक्शन को समय-समय पर कॉल करने का कोई तरीका है?

जवाबों:


214

आप चाहते हैं setInterval():

var intervalID = setInterval(function(){alert("Interval reached");}, 5000);

SetInterval () का पहला पैरामीटर भी मूल्यांकन किए जाने वाले कोड का एक स्ट्रिंग हो सकता है।

आप एक आवधिक कार्य को क्लियर कर सकते हैं:

clearInterval(intervalID);

15
मैंने उत्थान किया और फिर मेरे अपवोट (लेकिन डाउनवोट नहीं) को बचाने का फैसला किया क्योंकि आप सेटर्वल में एक स्ट्रिंग तर्क का उपयोग कर रहे हैं। कार्यकुशलता, सुरक्षा और उनके बंद होने की विशेषताओं के लिए, स्ट्रिंग स्ट्रिंग तर्क के पक्ष में कार्यों का उपयोग हमेशा किया जाना चाहिए।
जेसन एस

5
यह ठीक है, मुझे कोई आपत्ति नहीं है। setInterval()सवाल का सही जवाब है, कोई फर्क नहीं पड़ता पैरामीटर। यह केवल एक उदाहरण है, और दोनों विधियाँ परिभाषा के अनुसार सही हैं।
ज़ोम्बैट

2
मैं जेसन एस से सहमत हूं; यह वास्तव में एक समारोह होना चाहिए। आपके उदाहरण में, एकमात्र समस्या एक नगण्य प्रदर्शन हानि है, लेकिन यह एक बुरी आदत है।
मैथ्यू Crumley

4
मैं आप दोनों से सहमत हूं, एक फ़ंक्शन का उपयोग करना बेहतर है। मैंने कभी नहीं कहा कि यह नहीं था। यह किसी भी तरह से सही है, लेकिन टिप्पणियों के लिए, मैं एक फ़ंक्शन को शामिल करने के लिए उत्तर को संपादित करूंगा।
अक्टूबर को zombat

37

कृपया ध्यान दें कि setInterval () अक्सर आवधिक निष्पादन के लिए सबसे अच्छा समाधान नहीं है - यह वास्तव में इस बात पर निर्भर करता है कि आप किस जावास्क्रिप्ट को वास्तव में समय-समय पर कॉल कर रहे हैं।

जैसे। यदि आप 1000 इंच की अवधि के साथ सेटइंटरवल () का उपयोग करते हैं और आवधिक फ़ंक्शन में आप एक अजाक्स कॉल करते हैं जो कभी-कभी 2 सेकंड लेता है तो आपको वापस लौटने के लिए एक और अजाक्स कॉल करना होगा पहले प्रतिक्रिया वापस मिलने से पहले। यह आमतौर पर अवांछनीय है।

कई पुस्तकालयों में समय-समय पर विधियाँ होती हैं जो सेटलाइट के उपयोग के नुकसान से रक्षा करती हैं जैसे कि नेल्सन द्वारा दिया गया प्रोटोटाइप उदाहरण।

उस फ़ंक्शन के साथ अधिक मजबूत आवधिक निष्पादन प्राप्त करने के लिए जिसमें jQuery ajax कॉल है, कुछ इस तरह से विचार करें:

function myPeriodicMethod() {
  $.ajax({
    url: ..., 
    success: function(data) {
      ...
    },
    complete: function() {
      // schedule the next request *only* when the current one is complete:
      setTimeout(myPeriodicMethod, 1000);
    }
  });
}

// schedule the first invocation:
setTimeout(myPeriodicMethod, 1000);

एक अन्य दृष्टिकोण सेटटाइमआउट का उपयोग करना है लेकिन एक चर में बीता समय को ट्रैक करना और फिर प्रत्येक फ़ंक्शन पर गतिशील रूप से वांछित अंतराल के करीब के रूप में एक फ़ंक्शन को निष्पादित करने के लिए टाइमआउट विलंब को सेट करना है लेकिन कभी भी तेजी से प्रतिक्रियाएं प्राप्त नहीं कर सकते।


सेटटाइमआउट (myPeriodicMethod, 1000); 2 बार कहा जाता है। क्या यह फिर से किया गया है? मुझे लगता है कि सेट आउट को केवल पूर्ण कार्य में कहा जाना चाहिए
विष्णुदेव K

1
हां दूसरा सेटटाइमआउट () एक आवश्यकता नहीं है, आप बस myPeriodicMethod () को कॉल कर सकते हैं, जो पहले ajax कॉल को तुरंत निष्पादित करेगा ... लेकिन यदि आप इसे बहुत पहले कॉल से विलंब के साथ शेड्यूल करना चाहते हैं, तो आप इसे लिख सकते हैं मैनें लिखा है।
मैट Coubrough

16

सभी के पास एक सेटटाइमआउट / सेटइंटरवल समाधान पहले से ही है। मुझे लगता है कि यह नोट करना महत्वपूर्ण है कि आप फ़ंक्शन को पास कर सकते हैं, केवल तार नहीं। इसका वास्तव में स्ट्रिंग्स के बजाय वास्तविक कार्यों को पारित करने के लिए शायद थोड़ा "सुरक्षित" है जो उन कार्यों के लिए "विकसित" होगा।

// example 1
function test() {
  alert('called');
}
var interval = setInterval(test, 10000);

या:

// example 2
var counter = 0;
var interval = setInterval(function() { alert("#"+counter++); }, 5000);

3
+1 यदि आप जावास्क्रिप्ट के क्रॉकफोर्ड स्कूल के छात्र हैं , तो आप इसके सभी बुरे रूपों से बचने से बचते हैं।
पैट्रिक मैक्लेनी

@ पैट्रिक - मुझे नहीं लगता कि "नाम में $ (डॉलर चिह्न) या \ (बैकस्लैश) का उपयोग न करें" सुझाव jQuery लॉट के साथ अच्छी तरह से नीचे चला जाएगा :)
Russ कैम

6

पुराना सवाल लेकिन .. मुझे समय-समय पर टास्क रनर की भी जरूरत थी और टास्कटीमर लिखा । यह भी उपयोगी है जब आपको विभिन्न अंतरालों पर कई कार्य चलाने की आवश्यकता होती है।

// Timer with 1000ms (1 second) base interval resolution.
var timer = new TaskTimer(1000)

// Add task(s) based on tick intervals.
timer.addTask({
    name: 'job1',       // unique name of the task
    tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
    totalRuns: 10,      // run 10 times only. (set to 0 for unlimited times)
    callback: function (task) {
        // code to be executed on each run
        console.log(task.name + ' task has run ' + task.currentRuns + ' times.');
    }
});

// Start the timer
timer.start();

TaskTimerब्राउज़र और नोड दोनों में काम करता है। सभी सुविधाओं के लिए प्रलेखन देखें ।



3

हाँ - पर एक नज़र डालें setIntervalऔरsetTimeout निश्चित समय पर कोड को क्रियान्वित करने के लिए। setInterval समय-समय पर कोड निष्पादित करने के लिए उपयोग करने वाला होगा।

एक डेमो देखें और उपयोग के लिए यहां उत्तर दें


2
function test() {
 alert('called!');
}
var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop() { // call this to stop your interval.
   clearInterval(id);
}


1

मूल तरीका वास्तव में setInterval()/ है clearInterval(), लेकिन यदि आप पहले से ही प्रोटोटाइप लाइब्रेरी का उपयोग कर रहे हैं, तो आप PeriodicalExecutor का लाभ उठा सकते हैं:

new PeriodicalUpdator(myEvent, seconds);

यह ओवरलैपिंग कॉल को रोकता है। से http://www.prototypejs.org/api/periodicalExecuter :

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

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