Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько ajax-запросов на одной странице, ответы перепешиваются 
V
    Опции темы
POLTER
Дата 13.6.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Здравствуйте!
Возникла следующая проблема: Если на странице выполняются несколько ajax-запросов по таймерам, то полученные от скриптов ответы перемешиваются.
Можно ли избежать этого?
Я пока додумался лишь до выполнения этих запросов в отдельных iframe, но мне кажется это не лучшее решение...
Спасибо.
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
vasac
Дата 13.6.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Что значит перемешиваются?
PM WWW   Вверх
POLTER
Дата 13.6.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Допустим, есть 3 запроса, и все они посылают данные по таймерам. Так вот второй запрос получает ответ от первого, первый - от третьего и т.п.
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
Replicator
Дата 14.6.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 30.4.2006
Где: Outer Heaven

Репутация: нет
Всего: нет



Есть подозрение, что ты пользуешься одним объектом XMLHttpRequest. Создавай новый объект для каждого запроса.
--------------------
 
PM WWW ICQ   Вверх
POLTER
Дата 14.6.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Спасибо, примерно такая ошибка у меня и была.
Но теперь возникла другая проблема: если я выполняю эти запросы одновременно, то из них только последний выполняется нормально и получает ответ. От остальных ответа нет... smile В чем пожет быть проблема?
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
vasac
Дата 14.6.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Может быть покажите все-таки код?
PM WWW   Вверх
POLTER
Дата 14.6.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Вот файл 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.
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
vasac
Дата 14.6.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



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

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

PM WWW   Вверх
POLTER
Дата 14.6.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Как я понял, вы предлагаете объявлять req с помощью var?
Но тогда при попытке доступа к свойствам req выдает ошибку: Reference to undefined variable: req.
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
SelenIT
Дата 14.6.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



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>



--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
POLTER
Дата 14.6.2007, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 25.8.2006
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Спасибо всем!! Этот вариант работает smile
Проблема исчерпана  smile 

Это сообщение отредактировал(а) POLTER - 14.6.2007, 19:16
--------------------
Существует 10 типов людей: те, которые понимают твоичный код и те, которые его не понимают.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0776 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.