浏览 10590 次
锁定老帖子 主题:Ajax.Request如何捕获异常?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-03-31
var options={ method:"post", parameters:pars, onSuccess:function(transport);{ $('result');.value=transport.responseText; }, onFailure:function();{ alert("失败!!");; } }; var myAjax = new Ajax.Request(url,options);; 当服务端发生异常信息,onFailure方法并没有被调用,而还是执行onSuccess或onComplete,并且把异常信息显示到result,原先服务端出现异常的时候会统一调用exception.jsp显示异常信息,但用Ajax有没有办法做统一处理异常信息呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-03-31
zrweng 写道 prototype1.4.0.js
var options={ method:"post", parameters:pars, onSuccess:function(transport);{ $('result');.value=transport.responseText; }, onFailure:function();{ alert("失败!!");; } }; var myAjax = new Ajax.Request(url,options);; 当服务端发生异常信息,onFailure方法并没有被调用,而还是执行onSuccess或onComplete,并且把异常信息显示到result,原先服务端出现异常的时候会统一调用exception.jsp显示异常信息,但用Ajax有没有办法做统一处理异常信息呢? 我想问题可能是这样: Ajax.Request 是根据 XMLHttpRequest 的 status code 返回值来判断成功失败的,而服务端虽然发生异常,但是服务端的框架可能自动转向到错误处理页面了,而错误处理页面返回的 status code 依然是正常的 200,你可以通过打印(xhr.responseText) 检查一下返回的页面数据是否就是错误页的HTML源码。 所以如果你要利用 onFailure 事件,那么就只有改造下服务端的程序,比如可能是一个servlet,当发生异常时,直接返回HTTP协议设置的异常 status code(500+)。或者就是自己封装一下错误信息,在onComplete方法中先parse 一下。 |
|
返回顶楼 | |
发表时间:2006-03-31
确实,看来我也只能在response XML 加上<ErrorCode/>在客户端解析显示对应错误信息了
|
|
返回顶楼 | |
发表时间:2006-04-01
服务器发生异常了,不代表这次请求的js发生异常了。所以只能用特定的node来标志异常了。
|
|
返回顶楼 | |
发表时间:2006-04-09
把服务器的状态写入JSON头里面,
response.setHeader("X-JSON",myjsonString); 在你自定义的onSuccess方法中第二个参数即是Prototype自动eval后的json对象: onSuccess:function(resp,jsonObj); { if(jsonObj.statusCode == 100); //这是你自定义的json对象的状态属性 { alert("保存失败,原因:" + jsonObj.statusMsg);; return; } alert("保存成功");; //这里是你自定义的代码 } 关于JSON,请参考http://www.json.org,那里面有几个JAVA类,很方便. Note:在服务器设置response.setHeader时,JSON对象前后必须加上括号,看看Prototype的Ajax的代码就知道了,它是直接eval的. PS:感觉楼主没有分清楚HTTP STATUS与服务器内部异常 |
|
返回顶楼 | |
发表时间:2006-04-09
yfmine 写道 把服务器的状态写入JSON头里面,
response.setHeader("X-JSON",myjsonString); 在你自定义的onSuccess方法中第二个参数即是Prototype自动eval后的json对象: onSuccess:function(resp,jsonObj); { if(jsonObj.statusCode == 100); //这是你自定义的json对象的状态属性 { alert("保存失败,原因:" + jsonObj.statusMsg);; return; } alert("保存成功");; //这里是你自定义的代码 } 关于JSON,请参考http://www.json.org,那里面有几个JAVA类,很方便. Note:在服务器设置response.setHeader时,JSON对象前后必须加上括号,看看Prototype的Ajax的代码就知道了,它是直接eval的. PS:感觉楼主没有分清楚HTTP STATUS与服务器内部异常 这个方法很好。 以前看prototype的json时,还不以为多此一举。直接用http body传递的数据,何苦非要用json放到head里面? 今天yfmine指点,终于知道他的用意了~ |
|
返回顶楼 | |
发表时间:2006-04-09
prototype 1.5.0_rc0
735行 引用 return eval('(' + this.header('X-JSON') + ')');
而在1.5.0_pre0是: 引用 return eval(this.header('X-JSON')); 怎么差异这么大 |
|
返回顶楼 | |
发表时间:2006-04-10
liusong1111 写道 prototype 1.5.0_rc0
735行 引用 return eval('(' + this.header('X-JSON') + ')');
而在1.5.0_pre0是: 引用 return eval(this.header('X-JSON')); 怎么差异这么大 果然,1.4的也是return eval(this.header('X-JSON')); 还没正式用1.5,多谢提醒.我猜作者也觉得这样不够方便,所以才改了... |
|
返回顶楼 | |
发表时间:2006-04-10
之前用过1.3.1,现在在用1.4。
不知1.5有何改进?楼上两位可否指点一下:) |
|
返回顶楼 | |
发表时间:2006-04-11
好像主要是增加了个"$$"符,参见号,http://dev.rubyonrails.org/browser/spinoffs/prototype?rev=3432
在MSN rss搜索里找javascript prototype selector也能搜到几篇文章.还加了一堆String的方法,还没去研究.你用文本工具比较一下1.4和1.5源代码就知道变化了啊. |
|
返回顶楼 | |