彩票走势图

Ajax错误如何控制

转帖|其它|编辑:郝浩|2009-02-10 11:05:37.000|阅读 1250 次

概述:一个Aajax请求就像一个JavaScript线程。在要求执行的同时,JavaScript代码也在代码流里执行。那么你如何解决可能发生的冲突及由此产生的错误呢?如果你的网页有Ajax功能,且它不能下载你所期望的文本,你能通过点击浏览器上的重新载入(刷新)按钮来解决这一问题吗?如果可以的话,在什么条件下可行?如果不能,那是为什么呢?

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  一个Aajax请求就像一个JavaScript线程。在要求执行的同时,JavaScript代码也在代码流里执行。那么你如何解决可能发生的冲突及由此产生的错误呢?如果你的网页有Ajax功能,且它不能下载你所期望的文本,你能通过点击浏览器上的重新载入(刷新)按钮来解决这一问题吗?如果可以的话,在什么条件下可行?如果不能,那是为什么呢?

  如果服务器有任何问题,它会发送一个出错信息吗?如果会,那个错误信息会替代你正期望的文本还是有什么Ajax方法可以控制错误?如果不是,又是为什么呢?如果服务器死机,TCP/IP协议会发送错误信息吗?如果会,你怎样控制?如果不会,又是为什么?本文旨帮解决这系列的问题。

  没有错误校验的Ajax函数

  以下是一个没有错误校验代码的Ajax要求的执行过程:

  //variable to finally hold the Ajax downloaded text.

  pageDoc = "";

  var xmlHttp;

  try

  {

  // Firefox, Opera 8.0+, Safari

  xmlHttp = new XMLHttpRequest();

  }

  catch (e)

  {

  // Internet Explorer try

  {

  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

  }

  catch (e)

  {

  try

  {

  xmlHttp = new ActiveXObject("Microsoft.XMLHTTP";);

  }

  catch (e)

  {

  alert("Your browser does not support AJAX!");

  }

  }

  }

  xmlHttp.onreadystatechange=function()

  {

  if (xmlHttp.readyState == 4)

  {

  pageDoc = xmlHttp.responseText;

  }

  }

  xmlHttp.open("GET","//localhost/cgi-bin/sendPge2Str.pl";,true);

  xmlHttp.send(null);[SPAN]

  第一个语句说明了下载的文本存在易变性,JavaScript需要Ajax对象来发出Ajax请求。下一个语句是综合的尝试性锁定。这个语句之所以长是因为不同的浏览器和不同的IE版本是依靠不同的方式对Ajax对象示例。该例子中的Ajax对象名是xmlHttp。

  随后的语句就为Ajax对象定义了一个方法。每次Ajax对象状态改变的时候,这个方法都会被调用。当readystate为4的时候会最终的状态会更改。当readystate为4时,被定义的Ajax对象方法会被执行。这种情况下文本已经下载完毕并且可以为浏览器所使用。

  (xmlHttp.open())语句跟随打开请求的连接。随后的语句发出请求。当文本全部下载完,readystare变为4并执行定义的对象。

  点击重新载入的按钮

  这个规则对任何网页,包括有Ajax函数的网页都适用。网页正在显示或已经显示的时候,你如果发现所有HTML要素都没有下载,你应该刷新浏览器。这一操作可以重新下载你HTML要素。当服务器出现问题或传输线路出现障碍的时候,这一招管用。

  注意:它只在错误的Ajax载入内容不被浏览器缓冲时有作用。许多浏览器都是默认缓冲Ajax下载的文本。因此,当你点击重新载入的按钮,下载的Ajax文本是从浏览器缓冲处获得的。当然,要想不让浏览器缓冲也是可以做到的。你要在服务器的脚本上花点功夫。PHP,电脑脚本语言,就可以帮助解决这一问题。但是,这里暂不讨论这一点。

  如上所说,如果Ajax问题是服务器或网路意外造成的,点击浏览器的刷新按钮来解决Ajax下载错误是可行的。

  服务器或传输线不起作用的时候

  在此分享一些我自己的经验。如果在用户看过网页后服务器或传输线停止了,而又没有任何错误信息发送。

  服务器脚本不生效

  在此我所说的是那些要把Ajax文本从服务器发送到客户的脚本。如果脚本不起作用,而其他的没问题,那就是因为没有下载Ajax文本。但是,服务器可能会发送替代Ajax文本的错误信息。用户就可以看见错误信息了。最好的避免此类错误发生的方法是确保你的脚本无误。

  JavaScript Ajax对象的readyState性能

  readyState性能通过返回一个整数与正发生的请求保持联系。JavaScript Ajax 对象的readyState性能可以被附值为1,2,3或4.数值代表的意思如下:

  0:未初始化的

  1:载入中

  2:已载入

  3:互动的

  4:完成

  经常使用的数值是最后一个,它指示下载已经完成。这些数值可以被用来检查错误吗?答案是否定的。你不能用这些数值来测定是否有错误发生。你所能做的只是用这些数值检查发出的请求进行到了哪一步。[SPAN]

  HTTP Status

  当你使用HTTP服务器时你会需要以下的HTTP错误信息与状态信息。当传输线和服务器运转正常时,会出现这些错误/状态信息。

  200:OK

  这意味着请求成功。用户的请求被成功接收,理解和执行。

  404:Not Found (没找到)

  意思是服务器没找到任何可以与请求链接相匹配的。

  301:Moved Permanently (永远移动)

  304:Not Modified (网页未经修改)

  403:Forbidden (禁止)

  401:Unauthorized (未授权,错误的密码)

  以上只是一部分信息的举例。这些信息都由服务器发送。Ajax对象有两个性能来指示这这些错误/状态情况。这两个性能包括状态和状态文本。状态性能保存一个数值。例如,请求成功,状态性能会显示200;如果不成功则显示404。

  状态文本保存唯一的文本相当于一个数值,例如,如果请求成功,状态文本会显示“OK”;如果不成功,则显示“Not Found”。

  这两种性能任选其一,都可以检查错误或状态的情况。记住当传输线和服务器运转正常时这种方法才适用。注:大多数时候传输线和服务器都正常,所以这些HTTP状态信息一般都能正确指示错误。如果你的脚本不起作用,它也能指出来。

  最重要的HTTP状态码是200:“OK.”。它能指示请求是否被服务器接受。由Ajax对象状态性能指示数值,而文本“OK”则由Ajax对象状态文本性能指示。以下的代码片段可以告诉你怎样通过状态数值200进行错误检查:

  xmlHttp.onreadystatechange=function()
{

  if (xmlHttp.readyState == 4)

  {

  if (xmlHttp.status == 200)

  {

  pageDoc = xmlHttp.responseText;

  }

  }

  else

  {

  //report error – to the client.

  }

  }
 
该代码片段是Ajax对象中“状态改变事件触发器”方法的修改版本。在我解释该代码前,先让我们区分一下readyState为4和状态为200之间的差异。当readyState为4时,意味着传送完毕,也就是完成了某些下载。而下载的东西可能不是你希望的Ajax文本。它可能是来自服务器的错误信息,如果你的脚本不生效的话。[SPAN]

  当状态为200时,意味着服务器成功接收到了你的请求,理解并且接受该请求。这并不意味着服务器已经把用户请求的发送给了客户。另一方面,当readyState为4时,表示用户收到了某些东西,但不代表是你请求的东西。

  你需要同时使用这两种性能来确保所下载的东西就是你想要的东西。在上述的“状态改变事件触发器”方法的定义中,你有一个if的语句。该语句检查readyState是否为4。如果是,意味着下载完成。为了确保下载的东西是你想要的,我们还需测试其状态是否为200。如果是,你就下载到了你想要的。如果不是,我们就要处理错误信息。

  在你的Ajax进程里至少要涵盖上述的代码片段。

  Ajax请求的线程效应

  一个Ajax请求就像一个JavaScript线程。发出请求时,JavaScript代码也在代码流中执行。你可能想通过Ajax请求的结果(下载的文本)使那些语句在Ajax请求之下。而问题是你或许无法知道请求在什么时候会完成。在请求完成的时候,请求语句下面的语句可能已经被执行了。

  如果可以在“状态改变事件发生器”方法中使用Ajax结果,那当然最好。

  如果你必须在语句中使用Ajax 请求之下的Ajax结果,那你应该有一个Ajax请求之下的while-loop,它可以在Ajax请求下的语句继续执行前,循环检查文本是否被下载。如果要求的结果已经接收到的话,xmlHttp。“状态改变事件发生器”方法应该有一个用来指示whilt-loop的语句。

  反应时间比预计的更长

  反应时间比预计的要长该怎么办?当你确定时间超出过长时,终止Ajax请求。你要知道怎样判断时间是否过长。

  Ajax对象有一个方法叫做abort()。该函数用来终止Ajax请求。当请求被终止后,readyState的值归零,当然不会下载任何东西。你不用担心readyState或状态的值。下面的代码片段,位于Ajax进程以下,在5秒后终止Ajax请求:

  function abortAjax()
{

  xmlHttp.abort();

  }

  setTimeout("abortAjax()", 5000);
 
结论

  要对文中的每个问题给出一个清晰的答案是不太可能的。在某些条件下,如果您单击刷新按钮,你就可以得到你所希望的。也有可能,这些方法帮不到你。总是利用readyState和状态性能,可以弄清楚很多问题。不要忘记Ajax请求的线程效应。在最后的部分的展示,告诉了你如何避免可能发生的冲突。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:IT专家网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP