Будет ли вызов рекурсивной функции "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.
Каков наилучший способ обработки функции, которую нужно периодически вызывать?
Ответы
Ответ 1
Нет реальной рекурсии, потому что вызов GetData задерживается, и контекст JavaScript в то же время уничтожается. Таким образом, это не приведет к сбою двигателя JS.
Для вашего примера кода это в основном то, что произойдет на уровне JS-сервера:
- Инициализировать двигатель JS
- Создать контекст функции GetDatali >
- Выполнить инструкции GetData, включая "setTimeOut"
- "setTimeOut" инструктирует JS-движок вызывать функцию через 10 секунд
- Уничтожить контекст функции GetDatali >
- В этот момент, с точки зрения использования памяти, мы вернемся к шагу 1. Единственное различие заключается в том, что JS-движок хранил ссылку на функцию и когда ее вызывать (позволяет вызывать эти данные "futureCall" ).
- Через 10 секунд повторите шаг 2. "futureCall" будет уничтожен.