2016-05-03 1 views
0

Я прочитал несколько вопросов setTimeout, и ни одна из них не связана с вопросом, который я имею в виду. Я знаю, что могу использовать setInterval(), но это не мой предпочтительный вариант.Любая проблема с вызовом setTimeout?

У меня есть веб-приложение, которое теоретически может функционировать в течение дня или более без обновления страницы и более чем одной проверки в минуту. Возможно, я сработаю, если моя функция называет себя несколько сотен (или более) раз, используя setInterval? Я могу, например, достичь «переполнения стека»?

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

Мое решение состоит в том, чтобы вызвать функцию вызова моего jQuery ajax-кода, выполнить его действие, а затем как часть ajaxComplete, он делает setInterval для вызова себя снова за X секунд. Этот метод также позволяет мне изменять продолжительность между вызовами, поэтому, если мой сервер занят (медленным), один ответ может установить флаг для увеличения времени между вызовами ajax.

Пример кода моей идеи ...

function ServiceOrderSync() 
{ 
    // 1. Sync stage changes from client with the server 
    // 2. Sync new orders from server to this client 
    $.ajax({ "data": dataurl, 
    "success": function(data) 
      { // process my data }, 
    "complete": function(data) 
      { 
       // Queue the next sync 
       setTimeout(ServiceOrderSync, 15000); 
      }); 

} 

ответ

2

Вы не получите переполнение стека, так как вызов не действительно рекурсивный (я называю это «псевдо-рекурсивный»)

JavaScript - это язык, управляемый событиями, а когда вы вызываете setTimeout, он просто ставит в очередь событие в списке ожидающих событий, а выполнение кода затем просто продолжается с того места, где вы находитесь, и стек вызовов полностью разматывается до того, как следующее событие вытащится из этого списка ,

p.s. Я настоятельно рекомендую использовать Promises, если вы используете jQuery для обработки асинхронного кода.

+0

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

+0

Я читаю https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise и выглядит так, как ваше предложение хорошее, и кое-что мне нужно с комфортом. –

+1

Каждый разработчик JS должен, имхо, но помните, что реализация jQuery обещает не совсем то же самое, что и спецификация ES6 (и предыдущая Promises/A). – Alnitak