Memanggil fungsi setiap 60 detik

244

Menggunakannya setTimeout()dimungkinkan untuk meluncurkan fungsi pada waktu yang ditentukan:

setTimeout(function, 60000);

Tetapi bagaimana jika saya ingin meluncurkan fungsi beberapa kali? Setiap kali interval waktu berlalu, saya ingin menjalankan fungsi (setiap 60 detik, katakanlah).

Richard Knop
sumber

Jawaban:

373

Jika Anda tidak peduli jika kode dalam timerwaktu lebih lama dari interval Anda, gunakan setInterval():

setInterval(function, delay)

Itu menyalakan fungsi yang dilewatkan sebagai parameter pertama berulang kali.

Pendekatan yang lebih baik adalah, untuk digunakan setTimeoutbersama dengan self-executing anonymousfungsi:

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

yang menjamin, bahwa panggilan berikutnya tidak dilakukan sebelum kode Anda dieksekusi. Saya menggunakan arguments.calleecontoh ini sebagai referensi fungsi. Ini adalah cara yang lebih baik untuk memberikan fungsi nama dan panggilan yang dalam setTimeoutkarena arguments.calleesudah usang dalam ecmascript 5.

jandy
sumber
6
Panggilan berikutnya tidak mungkin dilakukan sebelum kode selesai dieksekusi. Penghitung waktu mundur secara asinkron tetapi panggilan balik harus antri. Ini berarti bahwa panggilan balik Anda dapat (dan mungkin akan) menyala setelah lebih dari 60 detik.
Andy E
14
Perbedaannya adalah bahwa setInterval umumnya akan menjalankan fungsi x milidetik setelah dimulainya iterasi sebelumnya, sedangkan pendekatan di sini akan menjalankan iterasi berikutnya x milidetik setelah yang sebelumnya berakhir
Gareth
41
Sama seperti catatan untuk orang lain yang mungkin menemukan ini - clearInterval()adalah fungsi mitra setInterval()dan berguna jika Anda ingin menghentikan panggilan fungsi berkala Anda.
Clay
7
Harap dicatat bahwa setInterval menjalankan fungsi untuk pertama kalinya setelah penundaan ms. Jadi jika Anda ingin menjalankan fungsi segera, dan MAKA ulangi setiap penundaan, Anda harus melakukan: func (); setInterval (func, delay);
Marco Marsala
5
Aku hanya tidak mendapatkan argumen ini. Saya memiliki fungsi getRates () tetapi (function () {getRates (); setTimeout (getRates (), 10000);}) (); tidak berfungsi: /
darth0s
66

menggunakan

setInterval(function, 60000);

EDIT: (Dalam kasus jika Anda ingin menghentikan jam setelah dimulai)

Bagian skrip

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

dan Kode HTML

<!-- Stop Button -->
<a href="#" onclick="window.clearInterval(int);return false;">Stop</a>
Burung biru
sumber
1
Dalam hal itu, bagaimana Anda menghentikannya dari pengulangan setelah mulai berulang?
Anderson Green
26

Sebuah lebih baik menggunakan JANDY 's jawaban untuk melaksanakan fungsi polling yang jajak pendapat setiap intervaldetik, dan berakhir setelah timeoutdetik.

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

MEMPERBARUI

Sesuai komentar, memutakhirkannya untuk kemampuan fungsi yang berlalu untuk menghentikan polling:

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.
    }
}
Om Shankar
sumber
Bagaimana Anda menghentikan polling dari dalam sendHeartBeat?
temuri
1
Ini contoh yang bagus! Ketika Anda menggunakan timer lebih sulit untuk menulis unit test, tetapi dengan pendekatan ini - mudah
Dmytro Medvid
Jawaban yang bagus. Anda dapat memperbarui salah satu penggunaan Tanggal baru sehingga konsisten, satu menggunakan (Tanggal baru) .getTime () dan yang lainnya (Tanggal baru ()). GetTime (). Keduanya tampaknya berfungsi dengan baik
Mark Adamson
intervaldan timeoutdalam milidetik, bukan?
Patrizio Bekerle
18

Di jQuery Anda bisa melakukan ini.

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>

Materi Iklan yang Optimal
sumber
Jumlahnya diperbarui kurang lebih setiap 12 detik - bukankah ini seharusnya satu menit?
Maks
1
lihat komentar // Change Interval here to test. For eg: 5000 for 5 secSaat ini sudah diatur untuk berubah setiap 6 detik. gunakan nilai 60000 selama satu menit
Optimum Creative
8
setInterval(fn,time)

adalah metode yang Anda cari.

Jamiec
sumber
7

Anda cukup memanggil setTimeout di akhir fungsi. Ini akan menambahkannya lagi ke antrian acara. Anda dapat menggunakan segala jenis logika untuk memvariasikan nilai keterlambatan. Sebagai contoh,

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

Panggil fungsi Javascript setiap 2 detik terus menerus selama 10 detik.

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

Ankit Tiwari
sumber
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
  )
}
srghma
sumber
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)

pengguna12449933
sumber
0

di sini kita menghibur bilangan asli 0 hingga ...... n (angka berikutnya dicetak di konsol setiap 60 detik), menggunakan setInterval ()

var count = 0;
function abc(){
    count ++;
    console.log(count);
}
setInterval(abc,60*1000);
Vijay sadhu
sumber
1
Sedikit penjelasan tentang cara menyelesaikan masalah akan lebih bagus.
vahdet
-1

Ada 2 cara untuk memanggil-

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

  2. setInterval(functionName, 60000);

fungsi di atas akan memanggil setiap 60 detik.

Gaurav Tripathi
sumber