Как отправлять ajax запрос с интервалом не смотря на закрытую вкладку в браузере

266
23 августа 2021, 05:40

Всем привет. Ребят, возможно ли вообще реализовать такое - при клике на кнопку отправлять ajax запрос на сервак с интервалом 1 минута и более для обновления данных в БД не смотря на закрытую или не активную вкладку в браузере. Решение как бы есть, но работает только если вкладка активна, т.е. в фокусе. Иначе браузер просто останавливает работу setinterval и по сути написанный скрипт просто бесполезен. Буду рад любым советам.

var newDate, 
  intervalId, 
  intervalId2; 
 
if (localStorage["timer"]) { 
  newDate = new Date(localStorage["timer"]); 
  timer(); // Инициализация текста в элементах. 
  intervalId = setInterval(timer, 1000); 
} 
 
function onPlows(tm) { 
  $('#expand').hide(); 
  $('.delinfo').hide(); 
  span.style.display = 'block'; 
  delplow.style.display = 'none'; 
  plbtn.style.display = 'none'; 
  newDate = Date.now() + 60 * tm; // tm - время которое задается в функции при нажатии на кнопку событие onclick 
  timer(); // Инициализация текста в элементах. 
  if (!intervalId) intervalId = setInterval(timer, 1000); 
  intervalId2 = setInterval(updFuel, 60000); 
  localStorage["timer"] = new Date(newDate).toISOString(); 
  localStorage["span"] = true; 
} 
 
function timer() { 
  intervalId2; 
  var now = Date.now(), 
    rest = newDate >= now ? Math.round((newDate - now) / 1000) * 1000 : 0, 
    s = ""; 
  if (!rest) { 
    clearInterval(intervalId); 
    clearInterval(intervalId2); 
    intervalId = null; 
    localStorage.removeItem("timer"); 
    localStorage.removeItem("updFuel"); 
    localStorage.removeItem("span"); 
    localStorage.removeItem("selecttract"); 
    localStorage.removeItem("selectplow"); 
    $.ajax({ 
      type: 'POST', 
      url: '../fieldfunc', 
      data: { 
        status_pl_field_udt: '2' 
      }, 
      success: function() { 
        setTimeout(function() { 
          window.location.href = "../field"; 
        }, 2000); 
      } 
    }); 
  } else { 
    var rest2 = rest % 3600000; 
    let hh = (rest - rest2) / 3600000; 
    rest = rest2; 
 
    rest2 = rest % 60000; 
    let mm = (rest - rest2) / 60000; 
    rest = rest2; 
 
    rest2 = rest % 1000; 
    let ss = (rest - rest2) / 1000; 
    let ms = rest2; 
 
    s = (hh < 10 ? "0" : "") + hh + ":" + 
      (mm < 10 ? "0" : "") + mm + ":" + 
      (ss < 10 ? "0" : "") + ss; 
  } 
  document.querySelector("#time").textContent = 'До конца обработки: ' + s; 
} 
 
function updFuel() { 
  $('.info').remove(); 
  $.ajax({ 
    type: 'POST', 
    url: '../fieldfunc', 
    data: { 
      tract_pl_udt: localStorage.getItem("selecttract"), 
      fuel_pl_upd: 1 
    }, 
    success: function(result) { 
      result = JSON.parse(result); 
      $('.updinfo').append('<p class="info" style="margin-bottom: 10px;"> Плуг: ' + localStorage.getItem("selectplow") + '<br>\ 
				Трактор: ' + result[0].title + '<br>\ 
				Топлива в баке: ' + result[0].fuel_now + ' литров</p>'); 
      if (result[0].fuel_now == 0) { 
        $errors.text('Закончилось топливо. У Вас есть 3 минуты для заправки топлива.'); 
        setTimeout(function() { 
          $.ajax({ 
            type: 'POST', 
            url: '../fieldfunc', 
            data: { 
              tract_set: localStorage.getItem("selecttract"), 
              fuel_set: 0 
            } 
          }); 
          clearInterval(intervalId); 
          clearInterval(intervalId2); 
          intervalId = null; 
          localStorage.removeItem("timer"); 
          localStorage.removeItem("updFuel"); 
          localStorage.removeItem("span"); 
          localStorage.removeItem("selecttract"); 
          localStorage.removeItem("selectplow"); 
          window.location.href = "../field"; 
        }, 1000 * 60 * 3); 
      } 
    } 
  }); 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<button class="btn plowsbtn" onclick="onPlows(' + 37000 * $fz + ');">Вспахать</button>

UPD "Лучше бы вы описали, что вы хотите сделать(что за скрипт) и какую информацию отправляете в базу?" Ответ: при клике на кнопку запустить таймер обратного отсчета и с интервалом 1 минута обновлять информацию в базе о топливе и обновленную информацию выводить пользователю на экран.

READ ALSO
Не скролится меню

Не скролится меню

Есть сайт - https://karel-spbru/

282
Оборачивание в вектор данных без копирования

Оборачивание в вектор данных без копирования

К примеру, я получаю указатель const void * на некоторый массив однородных данных (массив) и количество элементов в немЭто может быть, к примеру,...

139
Очистка стека вызовов с ZeroMemory?

Очистка стека вызовов с ZeroMemory?

Пытаюсь очистить стекСоздаю структуру после этого помещаю её в стек и пытаюсь очистить его, но на дебагере ничего не происходит

296