`
zhouyrt
  • 浏览: 1172468 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

超时处理---Ajax之五

阅读更多

上一篇只是检查是否超时,超时后却不做任何处理。这里如果超时,会给failure第二个参数msg赋值为“request timeout”。

 

这样使用者能清楚的知道一次HTTP请求的细节。实现细节较为诡异,得慢慢体会。这里timeout的效果和JQuery,Ext是一样的。如下

 

Ajax.text('../servlet/Ajax',{
	timeout : 2000,
	success : function(result){},
	failure : function(xhr,msg){
		alert(msg);
	}
});

 

 

源码见附件

分享到:
评论
12 楼 yangguo 2010-12-22  
kimmking 写道
rainsilence 写道
仔细看了下jquery的超时处理
其实很简单,并没有连发几个帖子的必要

假设定义了一个ontimeout句柄
var ontimeout = function() {.....}


在framework的某个地方定义了触发事件函数dispatchEvent

然后XMLHttpRequest定义为
var xmlHttp = .....

最后超时处理

setTimeout(function() {
    // 调用timeout句柄
    dispatchEvent("timeout");

    // 消除浏览器差异
    var onreadystatechange = xmlHttp.onreadystatechange;
    xmlHttp.onreadystatechange = function() {};
    try {
        var oldAbort = xmlHttp.abort();
        xmlHttp.abort = function() {
            oldAbort.call(xmlHttp);
            xmlHttp.readyState = 0;
        };
    } catch(e) {}
    xmlHttp.abort();

    // 如果xmlHttp需要第二次提交的话,需要以下这句,否则不需要
    xmlHttp.onreadystatechange = onreadystatechange;

}, 超时时间);

你说对了。
lz就是为了刷分的。



谈到刷分,好像没人能超越你。


11 楼 zhouyrt 2010-09-24  
wangweiwei358 写道
楼主,问你个问题哦。
请问下,isTimeout这个变量如果去掉呢?对运行有影响吗?
谢谢你能回复。


没有影响,它可选参数。
10 楼 wangweiwei358 2010-09-24  
楼主,问你个问题哦。
请问下,isTimeout这个变量如果去掉呢?对运行有影响吗?
谢谢你能回复。
9 楼 kimmking 2010-08-22  
rainsilence 写道
仔细看了下jquery的超时处理
其实很简单,并没有连发几个帖子的必要

假设定义了一个ontimeout句柄
var ontimeout = function() {.....}


在framework的某个地方定义了触发事件函数dispatchEvent

然后XMLHttpRequest定义为
var xmlHttp = .....

最后超时处理

setTimeout(function() {
    // 调用timeout句柄
    dispatchEvent("timeout");

    // 消除浏览器差异
    var onreadystatechange = xmlHttp.onreadystatechange;
    xmlHttp.onreadystatechange = function() {};
    try {
        var oldAbort = xmlHttp.abort();
        xmlHttp.abort = function() {
            oldAbort.call(xmlHttp);
            xmlHttp.readyState = 0;
        };
    } catch(e) {}
    xmlHttp.abort();

    // 如果xmlHttp需要第二次提交的话,需要以下这句,否则不需要
    xmlHttp.onreadystatechange = onreadystatechange;

}, 超时时间);

你说对了。
lz就是为了刷分的。
8 楼 rainsilence 2010-08-22  
仔细看了下jquery的超时处理
其实很简单,并没有连发几个帖子的必要

假设定义了一个ontimeout句柄
var ontimeout = function() {.....}


在framework的某个地方定义了触发事件函数dispatchEvent

然后XMLHttpRequest定义为
var xmlHttp = .....

最后超时处理

setTimeout(function() {
    // 调用timeout句柄
    dispatchEvent("timeout");

    // 消除浏览器差异
    var onreadystatechange = xmlHttp.onreadystatechange;
    xmlHttp.onreadystatechange = function() {};
    try {
        var oldAbort = xmlHttp.abort();
        xmlHttp.abort = function() {
            oldAbort.call(xmlHttp);
            xmlHttp.readyState = 0;
        };
    } catch(e) {}
    xmlHttp.abort();

    // 如果xmlHttp需要第二次提交的话,需要以下这句,否则不需要
    xmlHttp.onreadystatechange = onreadystatechange;

}, 超时时间);
7 楼 rainsilence 2010-08-21  
虽然,abort方法执行后会执行onreadystatechange句柄,但是由于浏览器不同,执行次数,readyState,都会不同

因此,直接对onreadystatechange句柄进行控制是很危险的。

lz的代码因为没有提供ontimeout句柄,所以代码勉强能用
6 楼 rainsilence 2010-08-21  
FireFox 下,调用abort,在onreadystatechange中,readyState == 4 会执行两遍。。。而httpstatus永远为0。
5 楼 yudylaw 2010-08-20  
Ajax 超时 IE 支持。FireFox 不支持吧。
4 楼 hardPass 2010-08-19  
也不对,上面的情况在ie下运行的结果。
在firefox下,没有报timeout
在Chrom下,运行也稍微有不同
3 楼 hardPass 2010-08-19  
特地测试了下,果然执行啦!
isTimeout = true;是在abort()后执行的。
一直以为abort()后,XMLHttpRequest.readyState 会被复位为0;
现在看来,其中还做了很多事情啊。




		if(timeout>0){
			timer = setTimeout(function(){
				document.write("\n<br>before abort " + xhr.readyState + isTimeout);
				xhr.abort();
				document.write("\n<br>after abort " + xhr.readyState + isTimeout);
				isTimeout = true;
			},timeout);
		}
		xhr.onreadystatechange = function(){
			document.write("\n<br>onreadystatechange " + xhr.readyState + isTimeout);
			if (xhr.readyState == 4 && !isTimeout){
				_onStateChange(xhr, type, success, failure);
				clearTimeout(timer);
			}else{}
		};


before abort 1false 
onreadystatechange 4false 
after abort 0false 



关键是XMLHttpRequest.abort()里干了些啥事情?

根据上面打印的东西,差不多猜测 XMLHttpRequest.abort()里干了这些内容:
1、先将XMLHttpRequest.readyState 直接置为4
2、触发XMLHttpRequest.onreadystatechange 事件
3、最好才将XMLHttpRequest.readyState 置为0


2 楼 zhouyrt 2010-08-19  
hardPass 写道
一口气跟读下来,虽然没有仔细测试代码,但也算是相当认真看了。

	xhr.onreadystatechange = function(){
			if (xhr.readyState == 4 && !isTimeout){
				_onStateChange(xhr, type, success, failure);
				clearTimeout(timer);
			}else{}
		};


这段代码,从上一帖看就觉得有问题。
这一帖还是没变。
只要是超时了,就不会执行_onStateChange,也就不会执行超时的处理啦


hardPass,谢谢您的提醒。看的很仔细。

这段代码没有问题的,你可以测试下超时的情况。这段代码比较容易误解。博客中没有写出来实现细节,因为太诡异了,初看起来不会执行,实际却执行了。

这篇与上篇的区别是超时后调用了xhr的abort方法,调用abort后status为0,在为0的判断中调用failure,这是最关键的。

试下就知...



1 楼 hardPass 2010-08-19  
一口气跟读下来,虽然没有仔细测试代码,但也算是相当认真看了。



	xhr.onreadystatechange = function(){
			if (xhr.readyState == 4 && !isTimeout){
				_onStateChange(xhr, type, success, failure);
				clearTimeout(timer);
			}else{}
		};


这段代码,从上一帖看就觉得有问题。
这一帖还是没变。
只要是超时了,就不会执行_onStateChange,也就不会执行超时的处理啦

相关推荐

    Ajax请求session超时处理流程

    Ajax请求session超时处理流程 java服务器端处理: SessionValidateFilter中修改: if (ServerInfo.isAjax(request)) { request.setAttribute("statusCode", 301); request.setAttribute("message", "Session ...

    前端开源库-ives-leaflet-ajax

    你可以根据项目需求调整Ajax请求的参数,如缓存策略、请求超时、错误处理等。同时,由于它是基于Leaflet的,所以可以无缝集成到已有的Leaflet项目中,也可以与其他Leaflet插件配合使用,增加更多的功能,如标记、弹...

    my-ajax-imitate-jq_ajax_JQ_

    jQuery是JavaScript库中最广泛使用的之一,其简洁易用的API使得开发者能够方便地处理DOM操作、事件处理以及Ajax请求。jQuery中的$.ajax()函数是一个强大的工具,它允许开发者发起HTTP请求到服务器,获取或发送数据。...

    为jquery的ajax请求添加超时timeout时间的操作方法

    如果在设定的时间内服务器没有响应,则会触发超时处理。使用timeout属性,开发者可以自行决定在什么情况下放弃等待服务器的响应,从而执行其他操作,比如再次发起请求或者给用户一个错误提示。 举个简单的例子,...

    ajax-data-model:ajax 通用数据请求处理模型。提供 ajax 请求、数据缓存、通用性接口约定处理等能力

    基于接口约定的通用回调处理支持(通用错误处理、loading 状态、通用参数、埋点上报&lt;接口超时、接口错误、接口异常、数据埋点等&gt;...) 快速开始 1. 下载安装 手动下载:到代码仓库下载 的 zip 包,取得 dist 目录内...

    dojo-0.3.1-ajax

    在0.3.1这个版本中,它对AJAX的支持是其关键特性之一,让我们深入探讨一下这个版本中的AJAX功能及相关知识点。 1. **Dojo AJAX基础** Dojo的AJAX功能主要由`dojo.xhr`模块提供,它提供了一系列方法来发起异步HTTP...

    前端项目-jasmine-ajax.zip

    5. **Clearing Mocks(清除模拟)**:在每次测试之间清理模拟的Ajax请求,防止不同测试之间的影响。 使用`jasmine-ajax`,开发者可以编写如下类型的测试: - **Success responses**:测试当Ajax请求成功时,代码...

    xe-ajax3.4.13.js 封装 fetch 异步请求 javascript 库

    5. **取消请求**:支持通过返回的 `AbortController` 实例取消正在进行的请求,这对于处理用户交互或组件生命周期中的请求特别有用。 **与 vxe-ajax 和 xeajax 标签关联** `xe-ajax` 通常与 `vxe-ajax` 和 `xeajax...

    dojo-0.4.3-ajax

    xhrGet和xhrPost都支持各种选项,例如处理响应的数据类型(JSON、XML、HTML等)、错误处理回调、超时设置等。此外,Dojo还引入了xhrPut和xhrDelete方法,对应HTTP的PUT和DELETE操作,为RESTful API的使用提供了便利...

    超轻量级的Ajax库-ajax.js

    - 超时处理:设置请求超时时间,超时后自动取消请求或提示用户。 - 请求缓存:对于不经常变化的数据,可以启用缓存机制,减少不必要的服务器请求。 综上所述,`ajax.js`作为一个超轻量级的Ajax库,提供了一种简单...

    jQuery基于$.ajax设置移动端click超时处理方法

    在jQuery中可以通过$.ajax方法设置请求超时处理,这样如果用户在设定时间内未能完成点击操作,可以给出相应的提示,或者返回到一个安全的状态。 jQuery的$.ajax方法是一种在页面中执行异步HTTP(Ajax)请求的方法。...

    前端项目-fdaciuk-ajax.zip

    4. **ajax.js**:根据项目名,这可能是一个专门处理Ajax请求的JavaScript文件,它实现了XMLHttpRequest对象或Fetch API来实现异步通信。 5. **data**或**mock**目录:可能包含模拟数据文件,用于在开发过程中测试...

    xe-ajax3.0.9.js

    - `ajax`: 提示这是一个处理Ajax请求的工具。 - `vxe-ajax`: 可能暗示这个库与`vxe-table`(一个基于Vue的表格组件)有关联,可能有特定的集成方式或优化。 - `xeajax`: 是`xe-ajax`的简写形式,可能在代码或文档...

    深入理解AJAX响应信息的处理

    5 - 对于XMLHttpRequest对象来说,表示请求或响应已被abort,或者连接超时。当状态变为4且状态码为200(表示成功)时,说明请求完成并且可以获取到服务器返回的数据。此时,我们会更新指定ID的div元素,将响应文本...

    IBM-AJAX,AJAX教程

    - **错误处理**:确保有适当的错误处理机制,如请求超时、网络中断等。 - **缓存利用**:对于可缓存的资源,考虑使用HTTP缓存策略。 - **安全性**:注意防止XSS和CSRF攻击,谨慎处理用户输入。 通过IBM的AJAX...

    Web 开发中Ajax的Session 超时处理方法

    在Web开发中,Session超时处理是一个常见的需求,特别是在用户长时间无操作或系统设定的特定时间后,为了保护用户的数据安全,系统会自动结束用户的会话。对于传统的HTTP请求,服务器端可以通过重定向来提示用户重新...

    extjs对ajax的支持文档

    在ExtJS中,Ajax支持是核心功能之一,它使得在浏览器端与服务器进行异步通信成为可能,无需刷新整个页面。以下是对Ajax支持的详细说明: 1. **Ajax基础**: - Ext.Ajax是ExtJS中的核心模块,用于处理所有与Ajax...

    农民的jquery之旅-jquery的Ajax

    《农民的jQuery之旅——jQuery的Ajax》一文深入浅出地介绍了如何利用jQuery库进行Ajax操作,这在Web开发中非常实用且易于学习。Ajax,全称Asynchronous JavaScript and XML,是一种创建动态网页的技术,允许在不刷新...

    ajax提交session超时跳转页面使用全局的方法来处理

    本文将详细介绍如何使用全局方法来处理AJAX提交时的Session超时,并跳转到特定页面。 首先,我们可以在服务器端设置一个过滤器(Filter)来检测Session的状态。在Java Web开发中,过滤器可以拦截每个HTTP请求,包括...

    Ajax 超时检查脚本

    在处理Ajax请求时,超时问题是一个常见的挑战。如果服务器响应时间过长,用户可能会遇到页面无响应的情况。因此,我们需要编写超时检查脚本来确保Ajax请求在预定时间内得到响应,否则将执行相应的错误处理。 以下是...

Global site tag (gtag.js) - Google Analytics