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


Автор: POLTER 13.6.2007, 15:09
Здравствуйте!
Возникла следующая проблема: Если на странице выполняются несколько ajax-запросов по таймерам, то полученные от скриптов ответы перемешиваются.
Можно ли избежать этого?
Я пока додумался лишь до выполнения этих запросов в отдельных iframe, но мне кажется это не лучшее решение...
Спасибо.

Автор: vasac 13.6.2007, 16:52
Что значит перемешиваются?

Автор: POLTER 13.6.2007, 19:12
Допустим, есть 3 запроса, и все они посылают данные по таймерам. Так вот второй запрос получает ответ от первого, первый - от третьего и т.п.

Автор: Replicator 14.6.2007, 11:33
Есть подозрение, что ты пользуешься одним объектом XMLHttpRequest. Создавай новый объект для каждого запроса.

Автор: POLTER 14.6.2007, 11:39
Спасибо, примерно такая ошибка у меня и была.
Но теперь возникла другая проблема: если я выполняю эти запросы одновременно, то из них только последний выполняется нормально и получает ответ. От остальных ответа нет... smile В чем пожет быть проблема?

Автор: vasac 14.6.2007, 12:02
Может быть покажите все-таки код?

Автор: POLTER 14.6.2007, 12:31
Вот файл ajax.js :
Код

function on_ready_state(onload) {
  if (req.readyState==4) {
    if (req.status==200 || req.status==0) {
      onload.call();
    } else {
      error();
    }
  }
}
function ajax(url,method,params,onload) {
  if (window.XMLHttpRequest) {
    req=new XMLHttpRequest();
  } else if (typeof ActiveXObject != undefined) {
    req=new ActiveXObject("Microsoft.XMLHTTP");
  }
  if (req) {
    try {
      if (onload) {
        req.onreadystatechange=function() { on_ready_state(onload) };
      }
      req.open(method,url,true);
      req.setRequestHeader("content-type", "application/x-www-form-urlencoded");
      req.send(params);
    } catch (err) {
      error();
    }
  }
}
function error() {
  alert("Ошибка передачи данных!"
    +"\n\nreadyState:"+req.readyState
    +"\nstatus: "+req.status
    +"\nheaders: "+req.getAllResponseHeaders());
}

Вот файл из которого все это вызывается:
Код

<script src="ajax.js"></script>
<script>
function test() { alert(req.responseText) }
ajax('1.htm', 'GET', null, test);
ajax('2.htm', 'GET', null, test);
ajax('3.htm', 'GET', null, test);
</script>

В файле 1.htm находится цифра 1, в 2.htm цифра 2 и 3.htm соответственно 3.

Автор: vasac 14.6.2007, 13:46
Таже ошибка у вас и сохранилась. Вы используете одну глобальную переменную req.
Нужно примерно так:
Код

function ajax(...) {
  var req = new XMLHttpRequest();
  ...
  req.onreadystatechange = (function() {
    // ... Функция определена в конкретном контексте ajax
    // в ней будет каждый раз использоваться свой req
  });
}

Автор: POLTER 14.6.2007, 14:30
Как я понял, вы предлагаете объявлять req с помощью var?
Но тогда при попытке доступа к свойствам req выдает ошибку: Reference to undefined variable: req.

Автор: SelenIT 14.6.2007, 18:11
POLTER, как вариант, можно всюду передавать ссылку на объект, к которому относится данный запрос/ответ, хотя бы так:
Код

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");
  }
  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);
    }
  }
}
function error(req) {
  alert("Ошибка передачи данных!"
    +"\n\nreadyState:"+req.readyState
    +"\nstatus: "+req.status
    +"\nheaders: "+req.getAllResponseHeaders());
}

Код

<script src="ajax.js"></script>
<script>
function test(req) { alert(req.responseText) }
ajax('1.htm', 'GET', null, test);
ajax('2.htm', 'GET', null, test);
ajax('3.htm', 'GET', null, test);
</script>

Автор: POLTER 14.6.2007, 18:25
Спасибо всем!! Этот вариант работает smile
Проблема исчерпана  smile 

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