Я использую уже определенную функцию и теперь хочу добавить к ней функцию pollServer, чтобы эти функции выполнялись снова и снова. Я продолжаю получать ошибки, когда пытаюсь обернуть существующую функцию в другую. Есть лучший способ сделать это?

function callD(id) {
  jQuery('document').ready(function pollServer(){
    window.setTimeout(function () {
      var ab = document.getElementById('a')
      console.log(ab);
      var bod = document.getElementById(+id)

      if (ab == null) {
        bod.style.background='green'
      } else {
        bod.style.background='blue'
      }  
    }, 1200);  
  })
}
callD();
pollServer();
1
user14955679 16 Янв 2021 в 00:04

3 ответа

Лучший ответ

Да, jQuery может сделать вещи довольно корявыми со всеми вложенными обратными вызовами. Чтобы сделать код более понятным и понятным, мне нравится разделять свои функции и определять их все на самом верхнем уровне скрипта, а затем скомпоновать их вместе следующим образом:

/**
 * this function will check for the existing elements
 * and update styles
 */
function setBodyStyle(id) {
  var ab = document.getElementById('a');
  console.log(ab);
  var bod = document.getElementById(+id);

  if (ab == null) {
    bod.style.background='green';
  } else {
    bod.style.background='blue';
  }  
}

/**
 * this function will create a timeout or interval
 * which will in turn run setBodyStyle()
 */
function pollServer() {

  // I think you want setInterval here if you're polling?
  // setInterval will run _every_ 1200ms,
  // setTimeout only runs once after 1200ms
  window.setInterval(function() {

    // not sure where you're getting id from,
    // but you'll want to pass it here
    setBodyStyle();
  }, 1200);
}

// when the document is ready, run pollServer()
jQuery(document).ready(pollServer);

Наличие небольших функций, которые выполняют одно действие, - это просто лучшая практика по причинам, которые я упомянул выше. Это сделает ваш скрипт более понятным, что поможет вам находить ошибки.

Например, две вещи, которые я не понимаю в приведенном выше коде:

  1. откуда взялась переменная id? Я не вижу, чтобы вы передавали его своей функции откуда угодно
  2. как ваш скрипт опрашивает сервер? Я тоже нигде не вижу кода для этого.
0
bmdev 15 Янв 2021 в 21:23

Похоже, вы имеете в виду запускать функцию pollServer каждые 1,2 секунды. Если так, вам нужно сделать две вещи

  • Используйте setInterval вместо setTimeout
  • Удалите последнюю строку для функции pollServer, поскольку она недоступна извне функционального блока ready.
0
Julian Gong 15 Янв 2021 в 21:18

pollServer не определено, где вы его вызываете. Кроме того, id не передается в callD, и у вас также есть +id, который не имеет смысла в document.getElementByid, поскольку если в идентификатор, это будет NaN. Вы также не опрашиваете сервер, вы устанавливаете тайм-аут один раз и выполняете некоторую работу, которая не связана с сервером. Вам может понадобиться setInterval для регулярного опроса или для повторного вызова функции при каком-либо условии, например, при сбое.

$(document).ready(function () {
  var intervalId;

  function callD(id) {
    function pollServer() {
      intervalId = window.setInterval(function () {
        var ab = document.getElementById('a')
        console.log(ab);
        var bod = document.getElementById(id)

        if (ab == null) {
          bod.style.background='green'
        } else {
          bod.style.background='blue'
        }  
      }, 1200);  
    }

    pollServer();
  }

  callD('some-id');
  // on some condtion eventually:
  clearInterval(intervalId);
})
1
Zac Anger 15 Янв 2021 в 21:17