JavaScript: Что заставит setInterval прекратить запуск? - PullRequest
2 голосов
/ 09 апреля 2010

Я пишу приложение для чата AJAX. Случайно, в FF 3.5.9 setInterval(), кажется, прекращает стрельбу. У меня нет clearInterval() в моем коде. Что может быть причиной этого?

$(document).ready(function () {

    $("#no-js-warning").empty();

    messageRefresher = new MessageRefresher(0);
    setInterval($.proxy(messageRefresher, "refresh"), 2000);
});

function notifyInRoom(user) {
    $.getJSON('API/users_in_room', { room_id: $.getUrlVar('key'), username: user }, function (users) {
        if (!$.isEmptyObject(users)) {
            $("#users").empty();
            $.each(users, function (index, username) {
                var newChild = sprintf("<li>%s</li>", username);
                $("#users").append(newChild);
            });
        }
        else {
            $("#users-loading-msg").text("No one is in this room.");
        }
    });
}   

function MessageRefresher(latest_mid) {
    this._latest_mid = latest_mid; 
}

MessageRefresher.prototype.refresh = function () {
    notifyInRoom($("#user-name").val());

    var refresher = this;
    $.getJSON('API/read_messages', { room_id: $.getUrlVar('key'), mid: refresher._latest_mid }, function (messages) {
        if (! (messages == null || $.isEmptyObject(messages[0]))) { // messages will always be at least [[], [], 0]
            $("#messages-loading-msg").hide();
            for (var i = 0; i < messages[0].length; i++) {
                var newChild = sprintf('<li><span class="username">%s:</span> %s</li>', messages[1][i], messages[0][i]);
                $("#messages").append(newChild);
            }
            refresher._latest_mid = messages[2];
            setUserBlockClass();
        }
        else {
            $("#messages-loading-msg").text("No messages here. Say anything...");
        }

    });
}

// Give the end-user-block class to the appropriate messages
// eg, those where the next message is by a different user  
function setUserBlockClass() {
    $("#messages li").each(function (index) {
        if ($(this).children(".username").text() != $(this).next().children(".username").text()) {
            $(this).addClass("end-user-block");
        }
    });
}

Я проверил самые последние ответы в Firebug, и это были те же ответы, которые были отправлены ранее. (Таким образом, это не похоже на необычный ответ, вызвавший сбой.)

Если я обновлю страницу, вызовы возобновятся.

Я устанавливаю точки останова в Firebug во время разработки, затем сбрасываю их и нажимаю «продолжить». Есть ли шанс, что это вызывает проблему? ОБНОВЛЕНИЕ: При дополнительном тестировании кажется, что это может быть проблемой.

Я также использую службу в другом браузере, и звонки для нее продолжаются.

Ответы [ 2 ]

1 голос
/ 14 сентября 2010

Я вижу остановку setInterval при отладке с помощью Firebug. Предположим, что это проблема синхронизации / прерывания, поскольку она отлично работает, пока я не переступаю через точки останова.

0 голосов
/ 25 сентября 2013

Одна вещь, на которую я только что натолкнулся, это то, что если вы проверяете, работает ли setInterval с чем-то вроде:

console.log("X");

Firebug будет отображать «X» только один раз. Firebug, по-видимому, отказывается регистрировать один и тот же текст дважды. Тем не менее, тестирование в консоли Chrome работало нормально.

Когда я изменил свой тестовый код на:

console.log(new Date());

Firebug дал мне ожидаемые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...