Gọi một chức năng cứ sau 60 giây


244

Sử dụng setTimeout()nó có thể khởi chạy một chức năng tại một thời điểm nhất định:

setTimeout(function, 60000);

Nhưng nếu tôi muốn khởi chạy chức năng nhiều lần thì sao? Mỗi khi một khoảng thời gian trôi qua, tôi muốn thực hiện chức năng (cứ sau 60 giây, giả sử).

Câu trả lời:


373

Nếu bạn không quan tâm nếu mã trong phạm vi timercó thể mất nhiều thời gian hơn khoảng thời gian của bạn, hãy sử dụng setInterval():

setInterval(function, delay)

Điều đó kích hoạt chức năng được truyền vào như là tham số đầu tiên lặp đi lặp lại.

Một cách tiếp cận tốt hơn là, để sử dụng setTimeoutcùng với một self-executing anonymouschức năng:

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

đảm bảo rằng cuộc gọi tiếp theo không được thực hiện trước khi mã của bạn được thực thi. Tôi đã sử dụng arguments.calleetrong ví dụ này như là tài liệu tham khảo. Đó là một cách tốt hơn để đặt tên cho hàm và gọi nó trong setTimeoutbởi vì arguments.calleekhông được dùng trong ecmascript 5.


6
Cuộc gọi tiếp theo không thể được thực hiện trước khi mã kết thúc thực thi. Bộ đếm thời gian đếm ngược không đồng bộ nhưng cuộc gọi lại phải được xếp hàng. Điều này có nghĩa là cuộc gọi lại của bạn có thể (và có thể sẽ) kích hoạt sau hơn 60 giây.
Andy E

14
Sự khác biệt là setInterval thường sẽ chạy hàm x mili giây sau khi bắt đầu lần lặp trước, trong khi cách tiếp cận ở đây sẽ chạy lần lặp tiếp theo x mili giây sau khi lần trước kết thúc
Gareth

41
Cũng như một lưu ý cho những người khác có thể tìm thấy điều này - clearInterval()là một chức năng đối tác setInterval()và có ích nếu bạn muốn ngừng cuộc gọi chức năng định kỳ của mình.
Clay

7
Xin lưu ý rằng setInterval thực thi chức năng lần đầu tiên sau khi trì hoãn ms. Vì vậy, nếu bạn muốn thực thi chức năng ngay lập tức và THEN lặp lại mọi độ trễ, bạn nên làm: func (); setInterval (func, delay);
Marco Marsala

5
Tôi chỉ không nhận được điều này. Điều này. Tôi có hàm getRates () nhưng (function () {getRates (); setTimeout (getRates (), 10000);}) (); không hoạt động: /
darth0s

66

sử dụng

setInterval(function, 60000);

EDIT: (Trong trường hợp nếu bạn muốn dừng đồng hồ sau khi nó được bắt đầu)

Phần script

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

và mã HTML

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

1
Trong trường hợp đó, làm thế nào bạn có thể ngăn nó lặp lại sau khi nó đã bắt đầu lặp lại?
Anderson Green

26

Một sử dụng tốt hơn jAndy 's câu trả lời để thực hiện một chức năng bỏ phiếu mà các cuộc thăm dò mỗi intervalgiây, và kết thúc sau timeoutgiây.

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

CẬP NHẬT

Theo nhận xét, cập nhật nó cho khả năng của chức năng được thông qua để dừng bỏ phiếu:

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

Làm thế nào bạn sẽ ngừng bỏ phiếu từ bên trong sendHeartBeat?
temuri

1
Đây là ví dụ tốt! Khi bạn sử dụng bộ hẹn giờ sẽ khó hơn để viết bài kiểm tra đơn vị, nhưng với phương pháp này - thật dễ dàng
Dmytro Medvid

Câu trả lời tốt. Vui lòng bạn có thể cập nhật một trong những cách sử dụng Ngày mới sao cho chúng nhất quán, một lần sử dụng (Ngày mới) .getTime () và lần khác (Ngày mới ()). GetTime (). Cả hai dường như hoạt động tốt mặc dù
Mark Adamson

intervaltimeouttính bằng mili giây, phải không?
Patrizio Bekerle

18

Trong jQuery bạn có thể làm như thế này.

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>


Con số sẽ gia hạn nhiều hơn hoặc ít hơn sau mỗi 12 giây - đây không phải là một phút sao?
Tối đa

1
xem bình luận // Change Interval here to test. For eg: 5000 for 5 secHiện tại nó được thiết lập để thay đổi cứ sau 6 giây. sử dụng giá trị 60000 trong một phút
Sáng tạo tối ưu

8
setInterval(fn,time)

là phương pháp bạn theo đuổi.


7

Bạn chỉ có thể gọi setTimeout ở cuối hàm. Điều này sẽ thêm nó một lần nữa vào hàng đợi sự kiện. Bạn có thể sử dụng bất kỳ loại logic nào để thay đổi các giá trị độ trễ. Ví dụ,

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


3

Gọi một chức năng Javascript cứ sau 2 giây liên tục trong 10 giây.

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

ở đây chúng tôi điều khiển số tự nhiên từ 0 đến ...... n (in số tiếp theo trong bảng điều khiển cứ sau 60 giây), sử dụng setInterval ()

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

1
Một chút giải thích về cách nó giải quyết vấn đề sẽ là tuyệt vời.
vahdet

-1

Có 2 cách để gọi-

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

  2. setInterval(functionName, 60000);

chức năng trên sẽ gọi cứ sau 60 giây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.