Длительный опрос вызывает превышение максимального размера стека вызовов

У меня есть эта (попытка) длинная функция опроса

Я хочу вызвать эту функцию в определенное время, а затем заставить работать длительный опрос, пока галерея имеет класс updating, галерея в этом случае - это $("... ")

function pollGallery(gallery){
    if (gallery.hasClass("updating")){
        var url = gallery.data("base") + "/refresh";
        $.ajax({ url: url, dataType: "script", complete: pollGallery(gallery), timeout: 30000 });
    }   
}

Когда я запускаю это, я получаю Maximum call stack size exceeded, и из журналов кажется, что он либо не вызывает ajax, либо тайм-аут не работает.


person Nick Ginanto    schedule 24.06.2014    source источник


Ответы (1)


Ваш код не передает функцию обратного вызова в complete, он просто бесконечно рекурсивно вызывает функцию.

    $.ajax({ url: url, dataType: "script", complete: function() {
        pollGallery(gallery);
    }, timeout: 30000 });

complete ожидает передачи функции. По complete: pollGallery(gallery) вы немедленно вызываете pollGallery(gallery) и пытаетесь присвоить возвращаемое значение опции complete, тем самым застревая в бесконечном цикле рекурсии.

person Fabrício Matté    schedule 24.06.2014
comment
ах спасибо! думал, что это можно отметить как нотацию onclick. Спасибо! - person Nick Ginanto; 24.06.2014
comment
@NickGinanto да, точно. ;) Шаблон обратного вызова тот же, вы должны передать функцию, которая будет выполняться, когда произойдет определенное событие (например, получен ответ сети, пользователь щелкнул элемент). - person Fabrício Matté; 24.06.2014
comment
Я виню это techoctave.com/c7 /сообщения/ - person Nick Ginanto; 24.06.2014
comment
@NickGinanto хорошо, в учебнике используется complete: poll, там poll - это ссылка на функцию, поэтому, по сути, функция передается в параметр complete. Он отличается от poll(), который ближе к вашему исходному случаю. =] - person Fabrício Matté; 24.06.2014