JavaScript'te periyodik olarak bir işlevi çağırmanın bir yolu var mı?


Yanıtlar:


215

İstersiniz setInterval():

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

SetInterval () işlevinin ilk parametresi ayrıca değerlendirilecek bir kod dizesi olabilir.

Periyodik bir işlevi şu şekilde temizleyebilirsiniz:

clearInterval(intervalID);

15
Yukarı oy verdim ve sonra, setInterval için bir dize bağımsız değişkeni kullandığınız için olumlu oyumu iptal etmeye karar verdim (ancak geri oy vermedim). Fonksiyonlar neredeyse her zaman bir dizge argümanı lehine, verimlilik, güvenlik ve kapanma özellikleri için kullanılmalıdır.
Jason S

5
Sorun değil, umurumda değil. setInterval()parametre ne olursa olsun sorunun doğru cevabıdır. Bu sadece bir örnek ve her iki yöntem de tanım gereği doğrudur.
zombat

2
Jason S ile aynı fikirdeyim; gerçekten bir işlev olmalı. Örneğinizde, tek sorun ihmal edilebilir bir performans kaybıdır, ancak bu, içine girmek kötü bir alışkanlıktır.
Matthew Crumley

4
İkinize de katılıyorum, bir işlevi kullanmak daha iyidir. Olmadığını asla söylemedim. Her iki şekilde de doğrudur, ancak yorumların iyiliği için yanıtı bir işlev içerecek şekilde düzenleyeceğim.
zombat

37

Lütfen setInterval () 'ın periyodik yürütme için en iyi çözüm olmadığını unutmayın - Bu gerçekten periyodik olarak hangi javascript'i çağırdığınıza bağlıdır.

Örneğin. SetInterval () 'i 1000 ms'lik bir periyotla kullanırsanız ve periyodik işlevde ara sıra geri gelmesi 2 saniye süren bir ajax çağrısı yaparsanız, ilk yanıt geri gelmeden önce başka bir ajax çağrısı yaparsınız. Bu genellikle istenmeyen bir durumdur.

Birçok kütüphanede, Nelson tarafından verilen Prototype örneği gibi, setInterval'i saf bir şekilde kullanmanın tuzaklarına karşı koruma sağlayan periyodik yöntemler vardır.

İçinde jQuery ajax çağrısı bulunan bir işlevle daha sağlam periyodik yürütme elde etmek için, şuna benzer bir şey düşünün:

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);

Diğer bir yaklaşım, setTimeout'u kullanmak, ancak bir değişkende geçen süreyi izlemek ve ardından bir işlevi istenen aralığa olabildiğince yakın ancak hiçbir zaman yanıtları geri alamayacağınız kadar hızlı yürütmek için her bir çağrıda zaman aşımı gecikmesini dinamik olarak ayarlamaktır.


setTimeout (myPeriodicMethod, 1000); 2 kez çağrılır. gerekli mi? Bence zaman aşımı ayarı yalnızca tam işlevde
çağrılmalıdır

1
Evet, ikinci setTimeout () bir gereklilik değildir, ilk ajax çağrısını hemen gerçekleştirecek olan myPeriodicMethod () 'u çağırabilirsiniz ... ancak ilk çağrıda bir gecikme ile planlamak istiyorsanız, bunu şu şekilde yazabilirsiniz: Ben yazdım.
Matt Coubrough

16

Herkesin zaten bir setTimeout / setInterval çözümü vardır. İşlevleri sadece dizelere değil setInterval'e de aktarabileceğinizi unutmamanın önemli olduğunu düşünüyorum. Aslında, bu işlevlere "değerlendirilecek" dizeler yerine gerçek işlevleri geçirmek muhtemelen biraz "daha güvenlidir".

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

Veya:

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

3
+1 Crockford JavaScript okulunun öğrencisiyseniz, tüm kötü biçimlerinde değerlendirmekten kaçınırsınız.
Patrick McElhaney

@Patrick - "İsimlerde $ (dolar işareti) veya \ (ters eğik çizgi) kullanma" önerisinin jQuery lotuyla iyi sonuçlanacağını sanmıyorum :)
Russ Cam

6

Eski soru ama .. Ayrıca periyodik bir görev çalıştırıcısına ihtiyacım vardı ve TaskTimer yazdım . Bu, farklı aralıklarda birden çok görev çalıştırmanız gerektiğinde de yararlıdır.

// 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();

TaskTimerhem tarayıcıda hem de Düğümde çalışır. Tüm özellikler için belgelere bakın .




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

Yerel yol gerçekten setInterval()/ clearInterval(), ancak zaten Prototip kitaplığını kullanıyorsanız, PeriodicalExecutor'dan yararlanabilirsiniz:

new PeriodicalUpdator(myEvent, seconds);

Bu, çakışan aramaları önler. Gönderen http://www.prototypejs.org/api/periodicalExecuter :

"yürütmek için verilen aralıktan daha uzun sürmesi durumunda, geri arama işlevinin birden çok paralel yürütülmesine karşı sizi korur (geri arama işlevindeki istisnalara karşı korumalı dahili bir" çalışan "bayrağı korur). Bu özellikle yararlıdır: kullanıcıyla belirli aralıklarla etkileşim kurmak için birini kullanın (örneğin, bir komut istemi kullanın veya aramayı onaylayın): bu, birden fazla mesaj kutusunun işlem görmeyi beklemesini önleyecektir. "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.