Как зациклить функции JavaScript с идентификаторами? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица Matrix, сгенерированная на PHP. И я хочу показать «чек» или «крест» на основе результата DNS-вызова. Эта таблица Matrix может содержать более 200 000 ячеек.

Я пытался поместить весь код PHP на одну и ту же страницу, но время ожидания PHP истекло, если нужно выполнить много вызовов DNS. Я перешел на Аякс. Добавил DIV внутри каждой ячейки и поместил код ajax, вызывающий второй PHP, который будет выполнять DNS-запрос. Это хорошо работает, но после 5000-6000 запросов некоторые ячейки не заполняются. Я думаю, потому что скрипт пытается делать вызовы для всех ячеек одновременно.

Это способ заставить ajax делать вызовы для каждой ячейки по одному?

У меня есть этоКод PHP:

$body .= '
  <script type="text/javascript">
';

foreach (getEachIpInRange($cidr) as $IP) {
    foreach ($rbls as $rbl) {
        $divid++;
        $body .= '    function updatediv' . $divid . '() {
      $.ajax({
        type: \'get\',
        url: \'verify.php?ip=' . $IP . '&dns=' . $rbl . '\',
        data: $(self).serialize(),
        success: function(data) {
          $("#div'  . $divid .  '").html(data).text();
        }
      })
    }
';
    }
}

$body .= '  </script>
';

, который генерирует следующий код:

  <script type="text/javascript">
    function updatediv1() {
      $.ajax({
        type: 'get',
        url: 'verify.php?ip=123.123.123.123&dns=host.domain1.tld',
        data: $(self).serialize(),
        success: function(data) {
          $("#div1").html(data).text();
        }
      })
    }
    function updatediv2() {
      $.ajax({
        type: 'get',
        url: 'verify.php?ip=234.234.234.234&dns=host.domain2.tld',
        data: $(self).serialize(),
        success: function(data) {
          $("#div2").html(data).text();
        }
      })
    }
    function updatediv3() {
      $.ajax({
        type: 'get',
        url: 'verify.php?ip=345.345.345.345&dns=host.domain3.tld',
        data: $(self).serialize(),
        success: function(data) {
          $("#div3").html(data).text();
        }
      })
    }
    function updatediv4() {
      $.ajax({
        type: 'get',
        url: 'verify.php?ip=456.456.456.456&dns=host.domain4.tld',
        data: $(self).serialize(),
        success: function(data) {
          $("#div4").html(data).text();
        }
      })
    }

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

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Пожалуйста, не генерируйте одну функцию для каждой ячейки;это раздутыйПросто создайте одну функцию, которая принимает число в качестве параметра и использует его для правильного вызова, выбора правильной ячейки и т. Д.

function updatediv(n) {
  const ipPart = `${n}${n+1}${n+2}`;
  $.ajax({
    type: 'get',
    url: `verify.php?ip=${ipPart}.${ipPart}.${ipPart}.${ipPart}&dns=host.domain${n}.tld`,
    data: $(self).serialize(),
    success: function(data) {
      $(`#div${n}`).html(data).text();
    }
  })
}

Оттуда вы можете просто выполнить простой цикл for и вызватьфункция для каждого значения n.

0 голосов
/ 04 октября 2019

Хорошо, ребята. Я успешно решил свою проблему после долгих исследований. Во-первых, я не могу загрузить все сразу. PHP просто перестанет работать, или браузер перестанет отвечать на запросы.

Мне пришлось загрузить ips и dns на различные массивы JavaScript из PHP. Итак, я придумал этот код:

function updatediv(divid,ip,rbl) {
  $.ajax({
    type: \'get\',
    url: `verify.php?ip=${ip}&rbl=${rbl}`,
    data: $(self).serialize(),
    success: function(data) {
      $(`#div${divid}`).html(data).text();
    }
  });

}

function looptable () {
    var divid=1;
    for (var a=0;a<=arrayIPs.length;a++) {
        (function (a) {
            setTimeout(function () {
              for (var b=0;b<=arrayRBLs.length;b++) {
                (function (b) {
                    setTimeout(function () {
                      updatediv(divid,arrayIPs[a],arrayRBLs[b]);
                      divid++;
                    }, 50*b);
                })(b);
              }
            }, 50*a*arrayRBLs.length);
        })(a);
    }
}
looptable();

Этот код будет заполнять таблицу ячейка за ячейкой, вызывая второй PHP с интервалом 50 мс, чтобы система не была перегружена. Дайте мне знать, что вы, ребята, думаете.

С уважением

0 голосов
/ 04 октября 2019

Начиная с решения @IceMetalPunk, чтобы избежать проблем с параллельными вызовами, вы можете сделать что-то подобное

function updatediv(n) {
  const ipPart = `${n}${n+1}${n+2}`;
  $.ajax({
    type: 'get',
    url: `verify.php?ip=${ipPart}.${ipPart}.${ipPart}.${ipPart}&dns=host.domain${n}.tld`,
    data: $(self).serialize(),
    success: function(data) {
      $(`#div${n}`).html(data).text();
      if(n < MAX_N)
        updatediv(n+1);
    }
  })
}

или, если проблема создания рекурсии, создать скрытый объект DOM для активации

<div id="hide_action" onClick="updatediv($('#hide_count').val());" style="display: none;"></div>

и измените функцию с помощью

if(n < MAX_N){
    $('#hide_count').val(n+1);
    $('#hide_action').click();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...