web-gelistirme-sc.com

SetTimeout tekrarı

Her 10 saniyede setTimeout tekrar etmeye çalışıyorum. setTimeout öğesinin varsayılan olarak yalnızca beklediğini ve ardından bir kez bir eylem gerçekleştirdiğini biliyorum. İşlemi nasıl tekrarlayabilirim?

setTimeout(function() {
  setTimeout(function() {
    console.log("10 seconds");
  }, 10000);
}, 10000);
41
Mr. 1.0

Belki de kullanmalısın setInterval()

67
uzyn

setInterval() muhtemelen aradığınız şeydir, ancak bunu yapmak istiyorsanız setTimeout() ile aynı efekti elde edin:

function doSomething() {
    console.log("10 seconds");
    setTimeout(doSomething, 10000);
}

setTimeout(doSomething, 10000);

Veya ayrı bir işlev bildirmek istemiyorsanız ve bir işlev ifadesine bağlı kalmak istiyorsanız, bunu bir named işlev ifadesi yapmanız gerekir:

setTimeout(function doSomething() {
    console.log("10 seconds");
    setTimeout(doSomething, 10000);
}, 10000);

(Veya arguments.callee öğesini kullanımdan kaldırılan dil özelliklerini kullanmaktan çekinmiyorsanız kullanın.)

38
nnnnnn

bana göre setInterval () en iyi durumda.
burada bazı kodlar: 

 setInterval(function() {

//your code

}, 10000); 
// you can change your delay by changing this value "10000".
17
Rikin Thakkar

@Nnnnnn ve @uzyn tarafından verilen cevapların aksine, aşağıdaki answer 'da detaylandırılmış nedenlerden dolayı setInterval' ı kullanmaktan caydırıyorum. Bunun yerine, aşağıdaki Delta Timing betiğini kullanın:

function DeltaTimer(render, interval) {
    var timeout;
    var lastTime;

    this.start = start;
    this.stop = stop;

    function start() {
        timeout = setTimeout(loop, 0);
        lastTime = + new Date;
        return lastTime;
    }

    function stop() {
        clearTimeout(timeout);
        return lastTime;
    }

    function loop() {
        var thisTime = + new Date;
        var deltaTime = thisTime - lastTime;
        var delay = Math.max(interval - deltaTime, 0);
        timeout = setTimeout(loop, delay);
        lastTime = thisTime + delay;
        render(thisTime);
    }
}

Yukarıdaki komut dosyası belirtilen render işlevini belirtilen interval dizinine olabildiğince yakın çalıştırır ve sorunuzu yanıtlamak için bir işlemi tekrarlamak için setTimeout işlevini kullanır. Senin durumunda aşağıdakileri yapabilirsin:

var timer = new DeltaTimer(function (time) {
    console.log("10 seconds");
}, 10000);

var start = timer.start();
15
Aadit M Shah

İşte setTimeout'u kullanarak, kendisini düzenli aralıklarla olabildiğince yakın olarak çağırmaya çalışan bir işlev. Çıkışı izlerseniz, zamanın kaydığını ve sıfırlandığını görebilirsiniz.

<script type="text/javascript">

function Timer(fn, interval) {
  this.fn = fn;
  this.interval = interval;
}

Timer.prototype.run = function() {

    var timer = this;
    var timeDiff = this.interval;
    var now = new Date();  // Date.now is not supported by IE 8
    var newInterval;

    // Only run if all is good
    if (typeof timer.interval != 'undefined' && timer.fn) {

      // Don't do this on the first run
      if (timer.lastTime) {
        timeDiff = now - timer.lastTime;
      }
      timer.lastTime = now;

      // Adjust the interval
      newInterval = 2 * timer.interval - timeDiff;

      // Do it
      timer.fn();

      // Call function again, setting its this correctly
      timer.timeout = setTimeout(function(){timer.run()}, newInterval);
  }
}


var t = new Timer(function() {
  var d = new Date();
  document.getElementById('msg').innerHTML = d + ' : ' + d.getMilliseconds();
}, 1000);


window.onload = function() {
  t.run();
};
</script>

<span id="msg"></span>
1
RobG

JQuery kullanarak, yapabilecekleriniz budur:

function updatePage() {

var interval = setTimeout(updatePage, 10000); // 10' Seconds

    $('a[href]').click(function() {
      $(this).data('clicked', true);
      clearInterval(interval); // Clears Upon Clicking any href Link
      console.log('Interval Cleared!');
    });
   // REPLACE 'YOUR_FUNCTION_NAME' function you would like to execute
    setTimeout(YOUR_FUNCTION_NAME, 500);

} // Function updatePage close syntax

updatePage(); // call the function again.

0
Shaze