Виклик функції кожні 60 секунд


245

За допомогою setTimeout()нього можна запустити функцію у визначений час:

setTimeout(function, 60000);

Але що робити, якщо я хотів би запустити функцію кілька разів? Щоразу, коли проходить часовий інтервал, я хотів би виконувати функцію (скажімо, кожні 60 секунд).

Відповіді:


374

Якщо вам не байдуже, чи може код у межах timerможе зайняти більше вашого інтервалу, використовуйте setInterval():

setInterval(function, delay)

Це запускає функцію, передану як перший параметр знову і знову.

Кращим підходом є використання setTimeoutпоряд із self-executing anonymousфункцією:

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

що гарантує, що наступний дзвінок не буде здійснено до виконання вашого коду. Я використовував arguments.calleeу цьому прикладі в якості посилання на функцію. Це кращий спосіб надати функції ім'я та викликати всередині, setTimeoutоскільки arguments.calleeв ecmascript 5 застаріле.


6
Наступний дзвінок неможливо здійснити до того, як закінчиться виконання коду. Таймер відлічується асинхронно, але зворотний виклик повинен бути в черзі. Це означає, що ваш зворотний дзвінок може (і, ймовірно, запуститься) через понад 60 секунд.
Енді Е

14
Різниця полягає в тому, що setInterval зазвичай працювати функція х мілісекунд після початку попередньої ітерації, в той час як підхід тут буде працювати на наступній ітерації х мілісекунд після того, як попередній закінчився
Gareth

41
Так само, як примітка для інших, хто може виявити це, - clearInterval()це функція партнера setInterval()і стане в нагоді, якщо ви хочете припинити періодичний дзвінок функції.
Глина

7
Зверніть увагу, що setInterval виконує цю функцію вперше після затримки мс. Отже, якщо ви хочете виконати функцію негайно, а потім повторити кожну затримку, вам слід зробити: func (); setInterval (функція, затримка);
Марко Марсала

5
Я просто не розумію цього аргументу. У мене є функція getRates (), але (function () {getRates (); setTimeout (getRates (), 10000);}) (); не працює: /
darth0s

66

використовувати

setInterval(function, 60000);

EDIT: (У випадку, якщо ви хочете зупинити годинник після його запуску)

Розділ сценарію

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

та HTML-код

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

1
У такому випадку, як би ви зупинили його повторення після того, як він почав повторюватися?
Андерсон Грін

26

Більш ефективне використання JANDY «s відповіді реалізувати функцію опитування , що опитування кожні intervalсекунди і закінчується через timeoutсекунди.

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

ОНОВЛЕННЯ

Відповідно до коментаря, оновивши його для здатності переданої функції зупинити опитування:

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.
    }
}

Як би ви зупинили опитування зсередини sendHeartBeat?
тимрі

1
Це хороший приклад! Коли ви користуєтесь таймерами, складніше писати одиничні тести, але при такому підході - це легко
Дмитро Медвідь

Хороша відповідь. Будь ласка, можете оновити одне із застосувань нової дати таким чином, щоб вони були послідовними, одне використання (нова дата) .getTime () та інше (нова дата ()). GetTime (). Здається, що обидва працюють нормально
Марк Адамсон

intervalі timeoutв мілісекундах, чи не так?
Патрісіо Бекерле

18

У jQuery ви можете зробити так.

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>


Число поновлюється більш-менш кожні 12 секунд - чи не повинна ця хвилина?
Макс

1
дивитись коментар // Change Interval here to test. For eg: 5000 for 5 secНаразі він змінюється кожні 6 секунд. використовуйте значення 60000 за хвилину
Оптимальний креатив


7

Ви можете просто викликати setTimeout в кінці функції. Це знову додасть його до черги подій. Ви можете використовувати будь-яку логіку для зміни значень затримки. Наприклад,

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


3

Викликайте функцію Javascript кожні 2 секунди безперервно протягом 10 секунд.

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

тут ми консоліруємо натуральне число від 0 до ...... n (наступний номер друкуємо в консолі кожні 60 секунд), використовуючи setInterval ()

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

1
Трохи пояснень, як це вирішує питання, було б чудово.
vahdet

-1

Є два способи зателефонувати -

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

  2. setInterval(functionName, 60000);

наведена вище функція буде дзвонити кожні 60 секунд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.