|
|
|
| Чат работает на Ajax. Схема такая.
Проверка хэш кода сообщений. В случае если отличается от предыдущего то идет загрузка всего списка сообщений. Потом вызов первой функции на таймер вешается.
Проблема в том, что есть шанс после нескольких минут ничего не делания, или десять или двадцать, он как все равно перестает на себя ссылаться и перестает выполняться.
Какие могу быть проблемы со временем? | |
|
|
|
|
|
|
|
для: bronenos
(04.06.2007 в 23:35)
| | Есть у JS механизм который отключает выполнение скриптов через некоторое время? Просто совсем не понимаю, почему так... | |
|
|
|
|
|
|
|
для: bronenos
(05.06.2007 в 08:04)
| | Не должно быть такого, я думаю. У меня чат на аяксе работает, по-моему, без временных ограничений. Хотя слишком долго я за ним не следил. У меня была противоположная проблема: когда вместо setTimer использовал setIntervale, чат уходил вразнос, ускорялся сам по себе... Можно поставить рядом с чатом визуальный таймер, дублирующий таймер, который управляет запросами и следить, что происходит. | |
|
|
|
|
|
|
|
для: coloboc66
(05.06.2007 в 09:18)
| | Просто у меня сначала открываю - все норм... каждые 5 секунд обновляется время онлайн в файле.
Потом захожу в файл через минут 10 - время стоит.. значит запросы перстают идти... | |
|
|
|
|
|
|
|
для: bronenos
(06.06.2007 в 21:14)
| | Таймер может работать бесконечно. Может быть, у вас в коде проверяется состояние ответа сервера и логика кода такова, что таймер останавливаетс при отрицательном ответе сервера? Я заметил в своём чате, что во время своей работы аякс время от времени выдаёт ошибку запроса к серверу (501 Bad Request), это скорее всего сервер виноват. Вот может у вас таймер и останавливается по этой ошибке? | |
|
|
|
|
|
|
|
для: coloboc66
(07.06.2007 в 09:19)
| | да нет.... вот мой код, отвечающий за сообщения....
не задавайтесь вопросами того, как это выглядит - это мой класс..
/* Функция загрузки сообщений */
function run_load (type)
{
var ajax = new ajax_stream();
ajax.open ('chat.php', function()
{
if (!ajax.status_ok())
return;
messages = ajax.response().split ('\n');
messages_to_div (messages);
/* И ставим таймер на обновление */
if (!type) setTimeout ('run_check();', 2000);
});
ajax.send ({
'sid' : sid,
'action' : 'load',
'down' : parent.options.show_down
});
}
/* Функция проверки новых сообщений */
function run_check()
{
if (typeof(parent.options) == 'undefined')
{ setTimeout ('run_check();', 200); return; }
var ajax = new ajax_stream();
ajax.open ('chat.php', function()
{
if (!ajax.status_ok())
return;
var last = ajax.response();
/* Если полученная контрольная сумма строк не совпадает с предыдущей */
if (last != hash)
{
/* Обновляем предыдущую */
hash = last;
/* Загружаем сообщения */
run_load();
}
else setTimeout ('run_check();', 2000);
});
ajax.send ({
'sid' : sid,
'action' : 'check'
});
}
|
| |
|
|
|
|
|
|
|
для: bronenos
(07.06.2007 в 13:14)
| | я сейчас расставил лог и после 15 минут наблюдений понял, что бываеют моменты, когда после send, onreadystatechange функция не вызывается - у меня срабатывает команда, стоящая сразу после сенд и не срабатывает, стоящая первой строчкой в онредичейндж | |
|
|
|
|
|
|
|
для: bronenos
(07.06.2007 в 15:50)
| | Я во избежание некорректной работы аякса после каждого запроса к серверу удаляю объект аякса, а перед каждым запросом к серверу снова его создаю, а вы это делаете? | |
|
|
|
|
|
|
|
для: coloboc66
(08.06.2007 в 09:07)
| | delete ajax;
если вы про это, то недавно решил это вставить | |
|
|
|
|
|
|
|
для: bronenos
(08.06.2007 в 09:35)
| | Не знаю, насколько корректно работает этот оператор. Я при загрузке страницы пишу var ajax=false; В функции аякса пишу
ajax.onreadystatechange=verify;
function verify()
{
if (req.readyState == 4)
{
if (req.status == 200){
processReqChange();//здесь обработка ответа сервера
req=false;
}
else alert("Не удалось получить данные:\n"+req.statusText +' '+req.status+ajax.url);
}
}
|
| |
|
|
|
|
|
|
|
для: coloboc66
(08.06.2007 в 09:45)
| | мм... можно null? | |
|
|
|
|
|
|
|
для: bronenos
(08.06.2007 в 11:11)
| | Фиг его знает... boolean я доверяю больше. | |
|
|
|
|
|
|
|
для: coloboc66
(08.06.2007 в 11:23)
| | я как раз наоборот... обычно если дело об объекте, а не скалярной величине - юзаю null =) | |
|
|
|
|
|
|
|
для: bronenos
(08.06.2007 в 11:30)
| | Наверное вот так правильнее будет:
if(processReqChange())req=false; | |
|
|
|