Cách kích hoạt yêu cầu AJAX Định kỳ?


113
<meta http-equiv="Refresh" Content="5">

Tập lệnh này tải lại hoặc làm mới trang sau mỗi 5 giây. Nhưng tôi muốn làm điều đó bằng cách gọi jQuery và AJAX. Có khả thi không?

Câu trả lời:


281

Như những người khác đã chỉ ra setInterval và setTimeout sẽ thực hiện thủ thuật. Tôi muốn làm nổi bật kỹ thuật nâng cao hơn một chút mà tôi học được từ video tuyệt vời này của Paul Irish: http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/

Đối với các tác vụ định kỳ có thể mất nhiều thời gian hơn khoảng thời gian lặp lại (như yêu cầu HTTP trên kết nối chậm), tốt nhất bạn không nên sử dụng setInterval(). Nếu yêu cầu đầu tiên chưa hoàn thành và bạn bắt đầu một yêu cầu khác, bạn có thể rơi vào tình huống có nhiều yêu cầu tiêu thụ tài nguyên được chia sẻ và bỏ đói lẫn nhau. Bạn có thể tránh sự cố này bằng cách chờ lên lịch yêu cầu tiếp theo cho đến khi yêu cầu cuối cùng hoàn thành:

// Use a named immediately-invoked function expression.
(function worker() {
  $.get('ajax/test.html', function(data) {
    // Now that we've completed the request schedule the next one.
    $('.result').html(data);
    setTimeout(worker, 5000);
  });
})();

Để đơn giản, tôi đã sử dụng lệnh gọi lại thành công để lập lịch. Mặt trái của điều này là một yêu cầu không thành công sẽ dừng cập nhật. Để tránh điều này, bạn có thể sử dụng lệnh gọi lại hoàn chỉnh để thay thế:

(function worker() {
  $.ajax({
    url: 'ajax/test.html', 
    success: function(data) {
      $('.result').html(data);
    },
    complete: function() {
      // Schedule the next request when the current one's complete
      setTimeout(worker, 5000);
    }
  });
})();

3
Đây không phải là một cuộc gọi hàm đệ quy? Nếu có, thì có ổn không nếu để nó chạy trong một khoảng thời gian dài lặp đi lặp lại, bởi vì nó là đệ quy? có thể là một trường hợp đệ quy vô hạn càng lâu càng ajax giữ thực hiện thành công
Rahul Dole

1
Ngoài ra, nếu bạn sử dụng setTimeout, thì có cách nào để ngăn luồng này từ bên ngoài khối mã này không? Giống như trong setInterval, bạn có thể chỉ cần gọi clearInterval ().
Rahul Dole,

16
@RahulDole đó là một câu hỏi hay nhưng nó không phải là đệ quy. Nó không được gọi trực tiếp từ hàm worker, vì vậy ngăn xếp sẽ không tiếp tục phát triển. Đối với điểm thứ hai của bạn, hãy kiểm tra tài liệu cho setTimeout () và bạn sẽ thấy nó trả về một id số có thể được chuyển cho clearTimeout ().
lôi cuốn vào

7
@RahulDole nếu bạn đang sử dụng chrome, hãy chơi với console.trace () để xem ngăn xếp lệnh gọi của một hàm. Các hàm được gọi bởi setTimeout () sẽ có một ngăn xếp rất ngắn và nó chắc chắn sẽ không bao gồm hàm được gọi là setTimeout ().
ảm đạm

1
@Anupal chỉ cần tạo một câu hỏi mới.
lôi cuốn vào

34

Có, bạn có thể sử dụng setTimeout()phương pháp hoặc phương thức JavaScript setInterval()để gọi mã mà bạn muốn chạy. Đây là cách bạn có thể thực hiện với setTimeout:

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

1
Chỉ sử dụng setTimeout (executeQuery, 5000); thay vì setTimeout ('executeQuery ()', 5000); - nó ngắn hơn và nhanh hơn.
rsp 19/02

4

Bạn có thể sử dụng setTimeouthoặc setInterval.

Sự khác biệt là - setTimeout chỉ kích hoạt chức năng của bạn một lần và sau đó bạn phải thiết lập lại. setInterval tiếp tục kích hoạt biểu thức lặp đi lặp lại, trừ khi bạn yêu cầu nó dừng lại


1

Tôi đã thử mã bên dưới,

    function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

Điều này không hoạt động như mong đợi trong khoảng thời gian được chỉ định, trang không tải hoàn toàn và hàm được gọi liên tục. Tốt hơn nên gọi setTimeout(executeQuery, 5000);bên ngoài executeQuery()trong một chức năng riêng biệt như bên dưới,

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  updateCall();
}

function updateCall(){
setTimeout(function(){executeQuery()}, 5000);
}

$(document).ready(function() {
  executeQuery();
});

Điều này hoạt động chính xác như dự định.

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.