Her 60 saniyede bir işlev çağırma


245

Kullanılması setTimeout()bunu belirli bir saatte bir işlev başlatmak mümkündür:

setTimeout(function, 60000);

Ama işlevi birden çok kez başlatmak istersem ne olur? Her zaman aralığı geçtiğinde, işlevi yürütmek istiyorum (her 60 saniyede bir, diyelim).

Yanıtlar:


374

İçindeki kodun timeraralığınızdan daha uzun zaman alıp almayacağını umursamıyorsanız , şunu kullanın setInterval():

setInterval(function, delay)

Bu, ilk parametre olarak geçirilen işlevi defalarca tetikler.

Daha iyi bir yaklaşım, setTimeoutbir self-executing anonymousişlevle birlikte kullanmaktır :

(function(){
    // do some stuff
    setTimeout(arguments.callee, 60000);
})();

bir sonraki çağrının kodunuz yürütülmeden yapılmamasını garanti eder. arguments.calleeBu örnekte işlev referansı olarak kullandım . Bu fonksiyona bir isim vermek ve bunu çağırmak için daha iyi bir yoldur setTimeoutçünkü arguments.calleeecmascript 5'te kullanımdan kaldırılmıştır.


6
Kodun çalıştırılması bitmeden bir sonraki çağrının yapılması mümkün değildir. Zamanlayıcı eşzamansız olarak geri sayar, ancak geri aramanın kuyruğa alınması gerekir. Bu, geri arama işleminizin 60 saniyeden uzun süre sonra tetiklenebileceği (ve muhtemelen tetikleneceği) anlamına gelir.
Andy E

14
Fark, setInterval'in bir önceki yinelemenin başlamasından sonra genellikle x milisaniye işlevini çalıştırmasıdır , oysa buradaki yaklaşım bir
öncekinin

41
Tıpkı bunu bulabilen başkaları için bir not olarak - periyodik fonksiyon çağrınızı durdurmak istiyorsanız, clearInterval()ortak bir işlevdir setInterval()ve kullanışlı olur.
Kil

7
SetInterval işlevinin ms gecikmesinden sonra işlevi ilk kez yürüttüğünü lütfen unutmayın. Bu nedenle, işlevi hemen yürütmek istiyorsanız ve sonra her gecikmeyi tekrarlarsanız, şunları yapmalısınız: func (); setInterval (işlev, gecikme);
Marco Marsala

5
Bu argümanları almıyorum. Callee şey. GetRates () işlevi var ama (function () {getRates (); setTimeout (getRates (), 10000);}) (); çalışmıyor: /
darth0s

66

kullan

setInterval(function, 60000);

EDIT: (Saati başladıktan sonra durdurmak isterseniz)

Komut dosyası bölümü

<script>
var int=self.setInterval(function, 60000);
</script>

ve HTML Kodu

<!-- Stop Button -->
<a href="#" onclick="window.clearInterval(int);return false;">Stop</a>

1
Bu durumda, tekrarlanmaya başladıktan sonra tekrarlanmasını nasıl durdurabilirsiniz?
Anderson Green

26

Daha iyi kullanımı JANDY 'ın cevabı bir yoklama işlevi uygulamak için bu anketler her intervalsonrasında saniye ve uçları timeoutsaniyeler.

function pollFunc(fn, timeout, interval) {
    var startTime = (new Date()).getTime();
    interval = interval || 1000;

    (function p() {
        fn();
        if (((new Date).getTime() - startTime ) <= timeout)  {
            setTimeout(p, interval);
        }
    })();
}

pollFunc(sendHeartBeat, 60000, 1000);

GÜNCELLEME

Yoruma göre, iletilen işlevi yoklamayı durdurma yeteneği için güncelleme:

function pollFunc(fn, timeout, interval) {
    var startTime = (new Date()).getTime();
    interval = interval || 1000,
    canPoll = true;

    (function p() {
        canPoll = ((new Date).getTime() - startTime ) <= timeout;
        if (!fn() && canPoll)  { // ensures the function exucutes
            setTimeout(p, interval);
        }
    })();
}

pollFunc(sendHeartBeat, 60000, 1000);

function sendHeartBeat(params) {
    ...
    ...
    if (receivedData) {
        // no need to execute further
        return true; // or false, change the IIFE inside condition accordingly.
    }
}

Yoklamayı içeriden nasıl durdurursunuz sendHeartBeat?
temuri

1
Bu iyi bir örnek! Zamanlayıcıları kullandığınızda birim testleri yazmak daha zordur, ancak bu yaklaşımla - kolaydır
Dmytro Medvid

İyi cevap. Lütfen yeni Tarih'in kullanımlarından birini tutarlı olacak şekilde güncelleyebilir, biri (yeni Tarih) .getTime () ve diğerini (yeni Tarih ()) kullanır. GetTime (). İkisi de işe yarıyor gibi görünüyor
Mark Adamson

intervalve timeoutmilisaniye cinsinden, öyle değil mi?
Patrizio Bekerle

18

JQuery'de bunu yapabilirsiniz.

function random_no(){
     var ran=Math.random();
     jQuery('#random_no_container').html(ran);
}
           
window.setInterval(function(){
       /// call your function here
      random_no();
}, 6000);  // Change Interval here to test. For eg: 5000 for 5 sec
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="random_no_container">
      Hello. Here you can see random numbers after every 6 sec
</div>


Sayı her 12 saniyede bir veya daha az yenilenir - bu bir dakika değil mi?
Max

1
yoruma bakın // Change Interval here to test. For eg: 5000 for 5 secŞu anda her 6 saniyede bir değişecek şekilde ayarlanmıştır. dakika için 60000 değerini kullanın
Optimum Creative

8
setInterval(fn,time)

peşinde olduğunuz yöntemdir.


7

İşlevin sonunda setTimeout'u çağırabilirsiniz. Bu, olay kuyruğuna tekrar ekleyecektir. Gecikme değerlerini değiştirmek için her türlü mantığı kullanabilirsiniz. Örneğin,

function multiStep() {
  // do some work here
  blah_blah_whatever();
  var newtime = 60000;
  if (!requestStop) {
    setTimeout(multiStep, newtime);
  }
}


3

10 saniyede bir sürekli olarak 2 saniyede bir Javascript işlevi çağırın.

var intervalPromise;
$scope.startTimer = function(fn, delay, timeoutTime) {
    intervalPromise = $interval(function() {
        fn();
        var currentTime = new Date().getTime() - $scope.startTime;
        if (currentTime > timeoutTime){
            $interval.cancel(intervalPromise);
          }                  
    }, delay);
};

$scope.startTimer(hello, 2000, 10000);

hello(){
  console.log("hello");
}


1
// example:
// checkEach(1000, () => {
//   if(!canIDoWorkNow()) {
//     return true // try again after 1 second
//   }
//
//   doWork()
// })
export function checkEach(milliseconds, fn) {
  const timer = setInterval(
    () => {
      try {
        const retry = fn()

        if (retry !== true) {
          clearInterval(timer)
        }
      } catch (e) {
        clearInterval(timer)

        throw e
      }
    },
    milliseconds
  )
}

1

function random(number) {
  return Math.floor(Math.random() * (number+1));
}
setInterval(() => {
    const rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';//rgb value (0-255,0-255,0-255)
    document.body.style.backgroundColor = rndCol;   
}, 1000);
<script src="test.js"></script>
it changes background color in every 1 second (written as 1000 in JS)


0

Burada setInterval () kullanarak doğal sayı 0 ila ...... n'yi konsolda (sonraki her 60 saniyede bir konsolda yazdırıyoruz)

var count = 0;
function abc(){
    count ++;
    console.log(count);
}
setInterval(abc,60*1000);

1
Sorunu nasıl çözdüğü hakkında biraz açıklama harika olurdu.
vahdet

-1

Aramanın 2 yolu vardır-

  1. setInterval(function (){ functionName();}, 60000);

  2. setInterval(functionName, 60000);

Yukarıdaki fonksiyon her 60 saniyede bir çalacaktır.

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.