Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ajax долго не держит
 
 автор: bronenos   (04.06.2007 в 23:35)   письмо автору
 
 

Чат работает на Ajax. Схема такая.
Проверка хэш кода сообщений. В случае если отличается от предыдущего то идет загрузка всего списка сообщений. Потом вызов первой функции на таймер вешается.
Проблема в том, что есть шанс после нескольких минут ничего не делания, или десять или двадцать, он как все равно перестает на себя ссылаться и перестает выполняться.
Какие могу быть проблемы со временем?

   
 
 автор: bronenos   (05.06.2007 в 08:04)   письмо автору
 
   для: bronenos   (04.06.2007 в 23:35)
 

Есть у JS механизм который отключает выполнение скриптов через некоторое время? Просто совсем не понимаю, почему так...

   
 
 автор: coloboc66   (05.06.2007 в 09:18)   письмо автору
 
   для: bronenos   (05.06.2007 в 08:04)
 

Не должно быть такого, я думаю. У меня чат на аяксе работает, по-моему, без временных ограничений. Хотя слишком долго я за ним не следил. У меня была противоположная проблема: когда вместо setTimer использовал setIntervale, чат уходил вразнос, ускорялся сам по себе... Можно поставить рядом с чатом визуальный таймер, дублирующий таймер, который управляет запросами и следить, что происходит.

   
 
 автор: bronenos   (06.06.2007 в 21:14)   письмо автору
 
   для: coloboc66   (05.06.2007 в 09:18)
 

Просто у меня сначала открываю - все норм... каждые 5 секунд обновляется время онлайн в файле.
Потом захожу в файл через минут 10 - время стоит.. значит запросы перстают идти...

   
 
 автор: coloboc66   (07.06.2007 в 09:19)   письмо автору
 
   для: bronenos   (06.06.2007 в 21:14)
 

Таймер может работать бесконечно. Может быть, у вас в коде проверяется состояние ответа сервера и логика кода такова, что таймер останавливаетс при отрицательном ответе сервера? Я заметил в своём чате, что во время своей работы аякс время от времени выдаёт ошибку запроса к серверу (501 Bad Request), это скорее всего сервер виноват. Вот может у вас таймер и останавливается по этой ошибке?

   
 
 автор: bronenos   (07.06.2007 в 13:14)   письмо автору
 
   для: 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 в 15:50)   письмо автору
 
   для: bronenos   (07.06.2007 в 13:14)
 

я сейчас расставил лог и после 15 минут наблюдений понял, что бываеют моменты, когда после send, onreadystatechange функция не вызывается - у меня срабатывает команда, стоящая сразу после сенд и не срабатывает, стоящая первой строчкой в онредичейндж

   
 
 автор: coloboc66   (08.06.2007 в 09:07)   письмо автору
 
   для: bronenos   (07.06.2007 в 15:50)
 

Я во избежание некорректной работы аякса после каждого запроса к серверу удаляю объект аякса, а перед каждым запросом к серверу снова его создаю, а вы это делаете?

   
 
 автор: bronenos   (08.06.2007 в 09:35)   письмо автору
 
   для: coloboc66   (08.06.2007 в 09:07)
 

delete ajax;
если вы про это, то недавно решил это вставить

   
 
 автор: coloboc66   (08.06.2007 в 09:45)   письмо автору
 
   для: 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);
  }
}

   
 
 автор: bronenos   (08.06.2007 в 11:11)   письмо автору
 
   для: coloboc66   (08.06.2007 в 09:45)
 

мм... можно null?

   
 
 автор: coloboc66   (08.06.2007 в 11:23)   письмо автору
 
   для: bronenos   (08.06.2007 в 11:11)
 

Фиг его знает... boolean я доверяю больше.

   
 
 автор: bronenos   (08.06.2007 в 11:30)   письмо автору
 
   для: coloboc66   (08.06.2007 в 11:23)
 

я как раз наоборот... обычно если дело об объекте, а не скалярной величине - юзаю null =)

   
 
 автор: coloboc66   (08.06.2007 в 11:55)   письмо автору
 
   для: bronenos   (08.06.2007 в 11:30)
 

Наверное вот так правильнее будет:
if(processReqChange())req=false;

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования