Подтвердить что ты не робот

Будет ли вызов рекурсивной функции "setTimeout" в конечном итоге убить JS Engine?

Скажем, у меня есть некоторые данные, которые мне нужно получить с сервера каждые 10 секунд. У меня была бы функция, которая получает данные через AJAX, а затем вызывает setTimeout для повторного вызова этой функции:

function GetData(){
   $.ajax({
       url: "data.json",
       dataType: "json",
       success: function(data){
         // do somthing with the data

         setTimeout(GetData, 10000);
      },
      error: function(){
         setTimeout(GetData, 10000);
      }
   });
}

Если кто-то покидает веб-страницу в течение всего дня, он может получить тысячи рекурсивных вызовов функций.

Я не хочу использовать setInterval, потому что это не учитывает сетевую задержку. Если сеть занята, и для обработки запроса требуется 15 секунд, я не хочу спрашивать его еще раз, прежде чем я получу тайм-аут AJAX.

Каков наилучший способ обработки функции, которую нужно периодически вызывать?

4b9b3361

Ответ 1

Нет реальной рекурсии, потому что вызов GetData задерживается, и контекст JavaScript в то же время уничтожается. Таким образом, это не приведет к сбою двигателя JS.

Для вашего примера кода это в основном то, что произойдет на уровне JS-сервера:

  • Инициализировать двигатель JS
  • Создать контекст функции GetData​​li >
  • Выполнить инструкции GetData, включая "setTimeOut"
  • "setTimeOut" инструктирует JS-движок вызывать функцию через 10 секунд
  • Уничтожить контекст функции GetData​​li >
  • В этот момент, с точки зрения использования памяти, мы вернемся к шагу 1. Единственное различие заключается в том, что JS-движок хранил ссылку на функцию и когда ее вызывать (позволяет вызывать эти данные "futureCall" ).
  • Через 10 секунд повторите шаг 2. "futureCall" будет уничтожен.