Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > рекурсивный ajax


Автор: Sniper 28.3.2010, 22:15
Хочется чтобы было так:
Код

function log_answer (req){
        if (req.responseText == "not_complete")
              ajax('login_repost.php','GET',null,log_answer); // тут надо сделать как-то задержку, чтобы запросы посылались раз в 2 секунды, например.
        else
        {
              alert ("логин обработан");
        }
}

ajax('login.php', 'GET', null, log_answer);


т.е.

1. вызываем login.php
2. если скрипт выдал результат "not_complete" вызываем второй скрипт login_repost.php
3. если скрипт login_repost.php тоже вернул"not_complete" , то мы его так и проболжаем выполнять пока он не вернёт нормальный ответ (попадёт в else и сработает alert ("логин отбработан");)

только AJAX не успевает обрабатывать такое количество "посылок" и выдаёт окошко с заголовками и прочей служебной информацией.

Пробовал сделать задержку setTimeout и setInterval, но функция 
Код

ajax('login_repost.php','GET',null,log_answer);
 
выполняется один раз почему-то и всё.

p.s фреймфорки не предлагать - не нужны мне.

Автор: bars80080 28.3.2010, 22:29
Цитата(Sniper @  28.3.2010,  22:15 Найти цитируемый пост)
Пробовал сделать задержку setTimeout и setInterval,

как?

и почему такая система? что там такого делает login_repost.php ?

Автор: IDVsbruck 28.3.2010, 23:00
Цитата(Sniper @  28.3.2010,  22:15 Найти цитируемый пост)
только AJAX не успевает обрабатывать такое количество "посылок" и выдаёт окошко с заголовками и прочей служебной информацией

С чего бы это? - Интересно взглянуть на функцию ajax().

Автор: gcc 28.3.2010, 23:46
можно использовать push server

http://javascript.ru/ajax/comet/overview и http://habrahabr.ru/blogs/webdev/41223/ 
у себя в блоге написал http://www.x0.org.ua/blog/user/1/view/7

Автор: Sniper 29.3.2010, 07:17
Цитата(IDVsbruck @  28.3.2010,  20:00 Найти цитируемый пост)
Интересно взглянуть на функцию ajax(). 

Код

function on_ready_state(req, onload) {
  if (req.readyState==4) {
    if (req.status==200 || req.status==0) {
      onload(req);
    } else {
      error(req);
    }
  }
}
function ajax(url,method,params,onload) {
  var req;
  if (window.XMLHttpRequest) {
    req=new XMLHttpRequest();
  } else if (typeof ActiveXObject != undefined) {
    req=new ActiveXObject("Microsoft.XMLHTTP");
  } else req = new ActiveXObject("Msxml2.XMLHTTP");
  if (req) {
    try {
      if (onload) {
        req.onreadystatechange=function() { on_ready_state(req, onload) };
      }
      req.open(method,url,true);
      req.setRequestHeader("content-type", "application/x-www-form-urlencoded");
      req.send(params);
    } catch (err) {
      error(req);
    }
  }
}


Добавлено @ 07:19
Цитата(bars80080 @  28.3.2010,  19:29 Найти цитируемый пост)
как? 

Код

function log_answer (req){
        if (req.responseText == "not_complete")
              setTimeout("ajax('login_repost.php','GET',null,log_answer)",2000); //как то так
        else
        {
              alert ("логин обработан");
        }
}
ajax('login.php', 'GET', null, log_answer);


Цитата

и почему такая система? что там такого делает login_repost.php ?

кадый скрипт посылает свою команду другому компьютеру через один единственный сокет.

Автор: IDVsbruck 29.3.2010, 13:45
Очень советую вынести переменную req в глобальную область и не передавать в функциях, а использовать глобально, а то замыкание на замыкании - ни к чему хорошему не приведет.
Кроме этого, один раз определив ее, не надо тратить ресурсы на ее определение каждый раз.
Идея, предложенная qcc, неплоха, но ее реализация слишком сложна для простой задачи, да и средствами javascript+html - костыль на костыле, несмотря на ссылки и все, что там описано. Тут, возможно, можно задуматься еще над одной реализацией псевдо-server-push - Continuations: отсылаем запрос на сервер, сервер создает отдельный thread и "держит" там респонс до появления события и отдает клиенту при его наступлении или по таймауту (скажем, 10-20 сек.) Ресурсов это ест немного, правда, нужна только многопоточная среда на сервере (не знаю, справляется ли с этим ПэХаПэ до 5-ой версии) и не требует сложной реализации на клиенте.

Автор: Sniper 29.3.2010, 13:58
хотелсь бы всётаки не переписывать в который раз реализацию этого всего, а доработать текущую!

Автор: bars80080 29.3.2010, 14:08
Цитата(Sniper @  29.3.2010,  07:17 Найти цитируемый пост)
              setTimeout("ajax('login_repost.php','GET',null,log_answer)",2000); //как то так

можно попробовать ещё так:

Код

setTimeout(function() { ajax('login_repost.php', 'GET', null, log_answer) } ,2000); 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)