Выполнять запрос Ajax каждую секунду
У меня есть вызов ajax в php файл. Я получаю результаты. Теперь я исследую, возможно ли, чтобы запрос ajax автоматически выполнялся каждые 1 секунду. Я публикую результаты в поле ввода, которое называется hidden
. Как я могу выполнить вызов ajax каждые три секунды без вызова функции?
$.ajax({
type: 'POST',
url: 'increment.php',
data: $(this).serialize(),
dataType: 'json',
success: function (data) {
$('#hidden').val(data);// first set the value
}
});
Ответы
Ответ 1
Что-то, что вы, возможно, захотите рассмотреть, это Server Sent Events (SSE)
Это технология HTML5, в которой Javascript будет " долгого опроса " конечной точки сервера (ваш файл PHP), чтобы узнать, произошли ли какие-либо изменения. Длительный опрос - это в основном, где JS (я не уверен, использует ли он Ajax или другую технологию) каждую секунду отправляет запрос в конечную точку
Вы можете попробовать:
#/your_js
var evtSource = new EventSource("increment.php");
evtSource.onmessage = function(e) {
$('#hidden').val(e.data);
}
Чтобы отправить данные, вы можете сделать ajax-вызов, который отправит обновленный объект JSON на сервер, например, у вас есть:
$(document).on("click", ".your_object", function(data) {
$.ajax({
type: 'POST',
url: 'increment.php',
data: $(this).serialize(),
dataType: 'json'
});
});
Это вызовет только запрос Ajax при выполнении события, и ваше приложение будет "слушать" ответ каждую секунду. Как вам известно, длинный опрос Ajax является супер-ресурсоемким, поэтому лучше смотреть на материал в Интернете, если вы хотите использовать настоящую технологию "в реальном времени", но в любом случае это будет гораздо более эффективная система чем просто использовать простой ajax для всего
Предостережение здесь - вам нужно будет изменить ваш increment.php
для обработки различных типов ответов
Ответ 2
Вы можете сделать это с помощью повторной серии вызовов setTimeout
. (Не используйте setInterval
с вызовами ajax
, вы получите хаос в setInterval
сроки; setInterval
отключит следующий вызов ajax, даже если предыдущий еще не завершен.)
Используйте setTimeout
для планирования первого вызова, а затем, когда он завершится, чтобы запланировать следующий и т. Д.:
var interval = 1000; // 1000 = 1 second, 3000 = 3 seconds
function doAjax() {
$.ajax({
type: 'POST',
url: 'increment.php',
data: $(this).serialize(),
dataType: 'json',
success: function (data) {
$('#hidden').val(data);// first set the value
},
complete: function (data) {
// Schedule the next
setTimeout(doAjax, interval);
}
});
}
setTimeout(doAjax, interval);
Обратите внимание, что я использую complete
, а не success
, чтобы запланировать следующий вызов, так что прерывание (временное падение в вашем "сетевом соединении", независимо от того, что) не убивает процесс.
Ответ 3
Да возможно использование setInterval
1) Держите ajax в функции.
function fun() {
$.ajax({
type: 'POST',
url: 'increment.php',
data: $(this).serialize(),
dataType: 'json',
success: function (data) {
$('#hidden').val(data);// first set the value
}
});
}
2) Теперь, используя setInterval
, вы можете выполнять его каждую секунду.
var interval = setInterval(fun, 1000);
3) Для паузы/очистки используйте clearInterval
clearInterval(interval);
4) Поскольку другие указали, что использование setInterval
для ajax
не является разумным, попробуйте использовать
var interval;
function callAjax() {
$.ajax({
type: 'POST',
url: 'increment.php',
data: $(this).serialize(),
dataType: 'json',
success: function (data) {
$('#hidden').val(data);// first set the value
interval = setTimeout(callAjax, 1000);
}
});
}
callAjax();
//clearTimeout(interval);