jquery/javascript setInterval

В настоящее время я разрабатываю функцию оповещения пользователя.

Мне удалось использовать setInterval контролировать мой Ajax-вызов (чтобы проверить, есть ли какое-нибудь уведомление для пользователя). Но моя проблема в том, что я хотел, чтобы уведомление появлялось только один раз на странице (теперь на экране отображается несколько уведомлений о сообщениях). Я знаю, что вы можете использовать setTimeout чтобы он вызывался только один раз, но мне также понадобилась страница, чтобы проверять, появляется ли уведомление о новом уведомлении каждые 5 минут.

Второй вопрос: возможно ли, чтобы первый раунд вызывал вызов Ajax мгновенно, а затем все остальные вызовы каждые 5 минут? Потому что я хотел, чтобы система проверяла сразу после входа в систему n, а затем каждые 5 минут.

Вот мой код

function getAjaxNotice() {
    $.post("/async/getnotification", {},
        function(response) {
            var notice = $(response);
            $("#notices").prepend(notice);
        });

    return false;
}

setInterval("getAjaxNotice()", 50000);

5 ответов

Решение

Прежде всего, вы должны обернуть ваш код инициализации в функцию onLoad:

$(document).ready(function() {
  // Put all your code here
});

Сделать его один раз легко, используйте вместо него.html(), а не добавляйте к нему:

$("#notices").html(notice);

В-третьих, как примечание стиля, вы не должны передавать строку в setInterval(). Скорее, передайте имя функции:

setInterval( getAjaxNotice, 50000 );

Наконец, чтобы заставить его вызывать функцию сейчас и снова через каждые 5 минут, используйте:

// Set the timer
setInterval( getAjaxNotice, 50000 );
// Call it once now
getAjaxNotice();

Также обратите внимание, что 50000 - это 50 секунд, а не 5 минут. 5 минут будет 5 * 60 * 1000 = 300000.

setIntervalВремя в миллисекундах.

5 minutes * 60 seconds * 1000 milliseconds = 300000ms

Кроме того, я предлагаю вам передать функцию setInterval не строка, так что вы можете избежать неявного использования eval,

setInterval(getAjaxNotice, 300000);

Звонить getAjaxNotice в начале страницы, поместите его в ready блок.

$(function(){
    getAjaxNotice();
});

Пара вещей...

setInterval("getAjaxNotice()", 50000);

Это не 5 минут.

5 минут = 300000 миллисекунд.

и если вы хотите, чтобы он работал мгновенно, а затем делать это каждые 5 минут, вы можете просто сделать

$(document).ready(function() {
     getAjaxNotice();



        function getAjaxNotice() {
             $.post("/async/getnotification" , 
             {},                              
             function(response)
             {
                  var notice = $(response);
                  $("#notices").prepend(notice);
             });
             return false;                      
       } 

       setInterval( getAjaxNotice(), 300000 );

});

Для первой проблемы вы должны хранить возвращаемое значение из setInterval, а затем позвонив clearInterval(myIntervalId) когда вы получите предупреждение.

По второй проблеме вы можете позвонить getAjaxNotice один раз во время загрузки тела, а затем, если оповещения не получены, позвоните setInterval в таком случае.

В вашей ситуации это звучит так, как будто вы имеете дело с несколькими проблемами. Таким образом, используя ваш текущий подход, вы можете сначала сделать свой AJAX-вызов и выполнить его с установленным таймаутом:

getAjaxNotice();
setTimeout( "getAjaxNotice()", 300000);

Во-вторых, убедиться, что пользователь получил сообщение только один раз, можно легко, если у вас есть какое-то событие "сообщение подтверждено". Предположим, что у вашего пользователя могут быть открыты браузеры на нескольких компьютерах. Если вы заставите пользователя щелкнуть сообщение или нажать кнопку "ОК", или выполните какое-либо действие, чтобы подтвердить получение сообщения, вы можете отключить другой вызов ajax, чтобы удалить это сообщение из буфера. на вашем сервере, но по-прежнему отображать его во всех открытых браузерах. Локальный браузер будет отображать его только один раз, потому что вы можете предотвратить отображение его на стороне клиента, если сообщение является дубликатом (основываясь на том, какие критерии имеют смысл для вашего приложения)

Тем не менее, вы должны изучить длинные опросы и COMET, http://en.wikipedia.org/wiki/Comet_%28programming%29. Comet - это концепция передачи уведомлений в веб-браузеры на основе событий на стороне сервера, в отличие от веб-браузеров, постоянно запрашивающих у сервера изменения.

Из-за ограничений в веб-фреймворках и браузерах это было достигнуто с помощью нескольких технологий, но наиболее распространенным представляется длительный опрос. HTML5 и websockets пытаются внести некоторые изменения, которые могут помешать опросу все вместе, но пока не доступны.

Long Polling, http://en.wikipedia.org/wiki/Push_technology и архитектура на основе COMET используются такими компаниями, как meebo и facebook. Не цитируйте меня по этому поводу, но по какой-то причине я склонен полагать, что Facebook использует веб-сервер на основе Erlang для показа своих сообщений в чате. Erlang и NodeJs - это всего лишь пара решений, которые вы можете использовать для создания облегченных веб-серверов, которые хорошо работают с тоннами длинных запросов на опрос, попадающих на ваши серверы.

Вы обязательно должны прочитать все это сами, так как имеется множество информации. Я экспериментировал с созданием сервера NodeJs в Amazon EC2, так как я традиционно работаю в.NET и не считаю, что IIS является правильным решением для поддержки функций длинного опроса приложения.net, использующего длинный опрос, и я Должен сказать, что мне очень нравятся NodeJ. Плюс язык javascript гораздо более знаком для меня, чем мои ограниченные знания Erlang.

Другие вопросы по тегам