Ajax снова запрашивает - PullRequest
0 голосов
/ 27 августа 2009

У меня снова проблема с AJAX-запросами. моя архитектура не изменилась, поэтому я использую сервлет Java на стороне сервера, а на клиенте я запускаю приложение JavaScript, запрограммированное и протестированное с помощью Firefox. В Firefox я также установил Firebug, потому что очень удобно наблюдать за входящими и исходящими запросами ajax. Однако моя проблема заключается в следующем:

Иногда мне приходится делать больше запросов на ajax. Я всегда проверяю перед отправкой нового, готов ли объект XMLHttpRequest к отправке (если он находится в состоянии 0 или 4), и только после этого я запускаю. Обычный запрос AJAX занимает от 200 до 300 мс. Но иногда я вижу ответы в firebug через 10 или 30 мс, которые не содержат никаких данных (но запрос поступает в сервлет). Но когда я получаю ответ, который хочу отправить клиенту в свой сервлет, я вижу правильную строку. Похоже, что сервлет не отправил его клиенту. Я попробовал flush () в сервлете, но ничего не изменилось. Я также уже реализовал совет из моего предыдущего поста ( Проблема с ответами AJAX ), что я не должен делать объект PrintWriter, вы получаете с res.getWriter () (HttpServletResponse res) глобальным (так что теперь это локально в моем методе doPost).

Кто-нибудь знает, что происходит не так?

Ответы [ 3 ]

0 голосов
/ 27 августа 2009

Вот код, который я использую в JavaScript для запуска нового запроса:

// the XMLHttpRequest object I created in the constructor is called this.httpReqObj
// this.queryAddr is the servlet that handels the responses
if(this.httpReqObj == null || this.queryAddr == null)
{
  return(false);
}

// check if XMLHttpRequest object is ready to send a new request.   
if(this.getReadyState() != 0 && this.getReadyState() != 4)
{       
  return(false);
}

// the message queue contains strings, that should be sent to the server
if(this.msgQueue.hasNext())
{
  var bundleMsg = "";
  var bundleCtr = 0;

  while(this.msgQueue.hasNext() && bundleCtr < DataRequester.BUNDLE_FACTOR)
  {
    bundleCtr ++;
    bundleMsg += this.msgQueue.consume() + "&";
  }

  // remove last character of string
  bundleMsg = bundleMsg.substring(0, bundleMsg.length - 1);

  // "POST": choose the transport mechanism to the server
  // "this.queryAddr": URL to which the query should be sent
  // "true": communication should be asynchron 

  // if argument not available, assume method is true           
  if(typeof method == 'undefined')
  {
    method = true;
  }

  this.httpReqObj.open("POST", this.queryAddr, method);

  // this function is called every time the status
  // of the http request has changed. There exist five states.
  // 0: not initialized
  // 1: currently loading
  // 2: finished loading
  // 3: waiting for return
  // 4: finished
  if(method)
  {
    this.httpReqObj.onreadystatechange = createObjectCallback(obj, func);
  }

  // create header for POST query
  this.httpReqObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  this.httpReqObj.setRequestHeader("Content-length", bundleMsg.length);         

  // send data to server
  this.httpReqObj.send(bundleMsg);

  // synchronous request
  if(method == false)
  {
    return(this.getResponseXML());
  }

}else
{
  return;
}
0 голосов
/ 27 августа 2009

Попробуйте отключить кэш браузера, чтобы определить, являются ли эти вызовы короткими, поскольку FF использовал ранее кэшированный запрос.

Вы также можете использовать что-то вроде веб-отладчика Fiddler, чтобы гарантировать, что серверная сторона возвращает правильные данные, поскольку показывает HTTP-трафик до того, как браузер его обработал

0 голосов
/ 27 августа 2009

Какой статус http (200, 304 и т. Д.) В ответах, которые возвращаются очень быстро?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...