Вызов функции, которая вызывает API несколько раз

#jquery #ajax

#jquery #ajax

Вопрос:

Я пытаюсь воспроизвести сценарий, в котором веб-страница содержит несколько областей, каждая из которых обновляется вызовом API и обновляется каждые X секунд.

 window.setInterval(function() {
  console.log("interval start");
  getData;
  console.log("interval end");
}, 5000);

//for (i = 1; i <= 3; i  ) {
//    console.log(i);
//    setTimeout(getData, 5000);
//}

function getData(url, id) {
  console.log("getData start");
  $.get(url, function(data) {
    console.log('data='   data);
    $(id).html(data);
  });
};

getData('@Url.Action("GetTemperature", "SomeData")', '#temp');
getData('@Url.Action("GetStockPrice", "SomeData")', '#stock');
getData('@Url.Action("GetStateName", "SomeData")', '#state');
getData('@Url.Action("GetARandomDate", "SomeData")', '#myDate');
 

Вот журналы:

  • Запуск getData
  • AjaxTimer:95 Начало получения данных
  • AjaxTimer:95 Начало получения данных
  • AjaxTimer:95 Начало получения данных
  • AjaxTimer:98 данных = 188
  • AjaxTimer:98 данных = Вермонт
  • AjaxTimer:98 данных = 88
  • AjaxTimer:98 data=2014-08-26T00:00:00
  • AjaxTimer: 83 интервала запуска
  • AjaxTimer: окончание интервала 85
  • AjaxTimer: 83 интервала запуска
  • AjaxTimer: окончание интервала 85
  • AjaxTimer: 83 интервала запуска
  • AjaxTimer: окончание интервала 85

getData не вызывается во второй раз. Я не уверен, где я ошибаюсь.

Комментарии:

1. getData поскольку оператор сам по себе ничего не делает; это просто ссылка на функцию. Вам нужно фактически вызвать функцию с некоторыми аргументами, чтобы выполнить ее, как вы находитесь в последних 4 строках вашей логики. Однако выполнение 4 AJAX-запросов каждые 5 секунд не является хорошим шаблоном для следования. Это не будет хорошо масштабироваться и фактически приведет к DDOS-атаке на ваш собственный сервер. Лучшей идеей было бы сначала вернуть все данные из одной конечной точки, а также использовать отправленные события Websockets / Server для их извлечения.

2. Да, getData не вызывается, но изменение его на getData() вызовет его

3. Рори, спасибо за ввод — имеет смысл.

Ответ №1:

Ваш setInterval это:

     window.setInterval(function () {
        console.log("interval start"); // Log to console
        getData;                       // A variable
        console.log("interval end");   // Log to console
    }, 5000);
 

Все вызовы функций в JavaScript должны заканчиваться на () , поэтому просто обновите среднюю строку на

         getData();
 

и getData будет вызываться по интервалу.

Комментарии:

1. Она будет вызвана, но без аргументов.

2. Конечно, но это близко к исходному источнику. Конечно, добавление аргументов возможно.