Diversia
@Diversia

Почему дублируются сообщения?

Делаю чат на PHP и JS. Каждые 10 сек. проверяю новые сообщения:
function chatLive() {
	var last = $('#chatLive .im:last').attr('id');

	if (last > 0) // все сообщения начиная с last
	{
		$.ajax({
			url: "/chat/ajax/live.php?last=" + last,
			type: "GET",
			success:function(data){
				$( "#chatLive" ).append(data);
				chatScroll();
				initMyScripts();
			}
		});
	}
	else // чат загружен первый раз - получаем 50 последних сообщений.
	{
		$.ajax({
			url: "/chat/ajax/live.php",
			type: "GET",
				success:function(data){
				$("#chatLive").html(data);
				chatScroll();
				initMyScripts();
			}
		});
	}

	$('#chatForm #loading').fadeOut(300);
}

$(document).ready(function() {
	chatLive();
	setInterval(function() {
		chatLive();
	}, 10000);
});

В PHP скрипте делаю select так:
$rsData = array_reverse($entityDataClass::getList([
    "select" => [
        "ID",
        "UF_DATE",
        "UF_MESSAGE",
        "UF_USER_NAME",
        "UF_USER_CREATED",
        "UF_USER_FOR",
        "UF_USERPIC"
    ],
    "filter" => [
    	"!UF_ACTIVE" => false,
        ">ID" => $last // id последнего сообщения
    ],
    "order" => ["ID" => "DESC"],
    "limit" => 50,
    "cache"=> ["ttl" => 360000],
])->fetchAll());

На ПК все хорошо, а в мобильных браузерах при выходе из ожидания (например, 10 мин. не пользоваться телефоном), открывая браузер (вкладка не закрывалась) появляется дубликаты сообщений (по несколько раз). Предполагаю что это из-за функции setInterval, которая скорее всего накапливается в мобильном, когда браузер/телефон спит, а потом срабатывает несколько раз. Может ошибаюсь, в JS не силен.

Подскажите пожалуйста, как решить проблему с дубликатами сообщений?
  • Вопрос задан
  • 558 просмотров
Решения вопроса 1
coderisimo
@coderisimo Куратор тега JavaScript
Простой способ пофиксить, как мне кажется, перед выводом проверять , если предыдущее сообщение и последующее одинаковы, то одно из них не попадет в чат.

оффтоп: Вообще, как раз для таких штук вебсокеты созданы. там setInterval не нужен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы