2014-01-19 4 views
0

У меня есть страница на моих форумах, на которой я пытаюсь получить автоматическое обновление при появлении нового сообщения, однако оно работает только с перерывами.jQuery auto загрузка со страницы

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

Благодаря

<script> 
var timestamp = Math.round((new Date()).getTime()/1000); 

function myTimer() { 
$.ajax({ 
url: 'loadtopic.php?id=<? echo $getid; ?>&time=' + timestamp, 
success: function(data) { 
    $("#append").before(data); 
    setTimeout(myTimer,3000); 
    timestamp = Math.round((new Date()).getTime()/1000); 
} 
}); 
} 
myTimer(); 
</script> 
+0

не использовать SetTimeout внутри AJAX запроса, а также вы можете использовать [setInterval()] (http://www.w3schools.com/jsref/met_win_setinterval.asp), чтобы создать синхронизированный опрос для загрузки новых сообщений. – spezzino

+0

На самом деле, использование тайм-аута в обработчике успеха кажется лучшим способом сделать это? – adeneo

+0

Когда обновление не удается, что вы видите в консоли разработчика вашего любимого веб-браузера? Сервер возвращает ошибку? Или данные просто плохие? –

ответ

0

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

<script> 
var timestamp = Math.round((new Date()).getTime()/1000); 

function myTimer() { 
    $.ajax({ 
    url: 'loadtopic.php?id=<? echo $getid; ?>&time=' + timestamp, 
    success: function(data) { 
     $("#append").before(data); 
     timestamp = Math.round((new Date()).getTime()/1000); 
    } 
    }); 
} 
myTimer(); 
setInterval(myTimer,3000); 
</script> 

В противном случае поместить SetTimeout в «полный» вариант и код будет выполняться, даже если запрос не удается.

<script> 
var timestamp = Math.round((new Date()).getTime()/1000); 

function myTimer() { 
    $.ajax({ 
    url: 'loadtopic.php?id=<? echo $getid; ?>&time=' + timestamp, 
    success: function(data) { 
     $("#append").before(data); 
     timestamp = Math.round((new Date()).getTime()/1000); 
    }, 
    complete: function() { 
     setTimeout(myTimer,3000); 
    } 
    }); 
} 
myTimer(); 
</script> 
0

Как бы это сделать:

  1. Создать глобальный (или скрыть все это дело где-нибудь) переменная, которая хранит последний раз, когда страница обновляется или загружена. window.latest_update = new Date()

  2. Создайте функцию, которая получает новые сообщения с сервера на основе текущей метки времени .

  3. Запустите эту функцию на интервале и запросите только сообщения с момента последней отметки . Вероятно, от 20 до 40 секунд, но оптимизируйте на основе нагрузки на ваш сервер. var PollServer = setInterval(get_posts, 20000)

  4. Имейте отдельную функцию, которую вы можете вызвать для загрузки сообщений на страницу. Это позволит вам сохранить код как модульный.

0

Попробуйте изменить порядок вашего кода:

<script> 
function myTimer() { 
    var timestamp = Math.round((new Date()).getTime()/1000); 
    $.ajax({ 
     url: 'loadtopic.php?id=<? echo $getid; ?>&time=' + timestamp, 
     success: function(data) { 
     $("#append").before(data); 
     setTimeout(myTimer,3000); 

     } 
    }); 
} 

myTimer(); 
</script> 
+0

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

+0

Почему бы и нет? Когда успех ajax-вызова и время ожидания вызова, при следующем запуске myTimer отметка времени будет обновлена ​​для нового вызова ajax. –

+0

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

Смежные вопросы