Основная проблема Ajax Cache - PullRequest
0 голосов
/ 31 декабря 2010

У меня есть одна страница, которая мне нужна, чтобы иногда асинхронно проверять сервер, чтобы видеть, является ли состояние страницы текущим (в основном, Live или Offline). Вы увидите, что у меня есть функция с переменной live, которая устанавливается при начальной загрузке страницы. Затем я делаю ajax-запрос к серверу, чтобы узнать, является ли статус live истинным или ложным. Я сравниваю исходную переменную реального времени с недавно возвращенным объектом данных json. Если они одинаковые, я ничего не делаю, но если они разные, я применяю некоторые классы CSS. Я рекурсивно запускаю его с помощью setTimeout (есть ли лучший способ сделать это рекурсивно?).

Моя проблема: data.live не изменяется с момента своего первоначального запуска, даже если он изменился в БД. Я знаю, что мой MySQL работает, потому что он возвращает правильное значение при начальной загрузке. Это похоже на проблему кеширования.

Любая помощь очень ценится.

function checkLive() {
    var live = <?=$result["live"]?>;

    $.ajax({
        type: 'get',
        url: '/live/live.php',
        dataType: 'json',

        success: function(data) {
            console.log('checking for updates... current:' + data.live);
            if (data.live == live) {
                return;
            } else {
                var elems = $('div.player_meta, object, h3.offline_message');
                if (data.live == '1') {
                    elems.removeClass('offline').addClass('live');
                } else {
                    elems.addClass('live').addClass('offline');
                }
            }
        }
    });

    setTimeout(function() { checkLive() } ,15000);
} 

checkLive();

Ответы [ 3 ]

5 голосов
/ 31 декабря 2010

Используйте параметр cache $.ajax(), чтобы добавить прерыватель кэша к URL, например:

$.ajax({
    type: 'get',
    url: '/live/live.php',
    dataType: 'json',
    cache: false,
    //success, etc.
});

Если это не решает проблему ... посмотрите на firebug, посмотрите, выполняется ли запрос (он обязательно должен быть после этого), если все еще получает старое значение, проблема в PHP, а не в JavaScript.


Не имеет отношения к проблеме, просто совет: если вам не нужны параметры, вы можете пропустить анонимный вызов функции, это:

setTimeout(function() { checkLive() } ,15000);

может быть просто:

setTimeout(checkLive, 15000);
0 голосов
/ 31 декабря 2010

Я думаю, что у Ника Крэйвера правильный ответ.

Что касается другого пункта вопроса, который вы - SetTimeout, вы можете использовать SetInterval () и избежать рекурсивного вызова.Но на самом деле я бы остановился на setTimeout () и добавил бы коэффициент в 15000 раз.установить этот фактор в качестве параметра контрольного списка.Тогда у вас будет чек, который будет постепенно задерживаться во времени.Это позволит избежать МНОГО HTTp-запросов от парня, который все еще находится на вашей странице с 48 часов.

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

function checkLive(settings) {
    (...) //HERE ajax STUFF
    setTimeout(function() {
        if ( (settings.reload <2000000000) && (settings.growingfactor > 1) ) {
            checkLive(settings);
            settings = jQuery.extend(settings,{reload:parseInt(settings.reload*settings.growingfactor,10)});
        }
    },settings.reload);
}
0 голосов
/ 31 декабря 2010

Вы можете проверить, является ли это проблемой кэширования, добавив уникальный идентификатор в URL:

изменить url: '/live/live.php', на url: '/live/live.php?'+new Date().getTime(),

Cheers

G.

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