XMLHttpRequest实现终止请求和超时

本文介绍了如何使用XMLHttpRequest及XMLHttpRequest2中的API来实现HTTP请求的取消与超时处理。详细解释了abort()方法的作用及其在不同场景下的应用,并提供了一个具体的实现示例。

这里是使用的XMLHttpRequest2中的API,口蹄疫通过XMLHttpRequest对象的 abort( )方法 来取消正在进行的HTTP请求,abort( )方法是在XMLHttpRequest和XMLHttpRequest2中都可用的,调用abort( )方法在这个对象上触发abort事件。

调用abort( )的主要原因是完成像取消或超时请求消耗的是啊进太长或当响应变得无关时的情况
例如:使用XMLHttpRequest为文本输入域请求自动完成推荐,如果用户在服务器的建议到达之前输入了新的字符,这时等待请求就不再有用了,所有应该终止

XMLHttpRequest2中定义了 timeout 属性来指定请求自动终止的毫秒数,也定义了timeout事件用于超时发生时触发,但是到目前位置,浏览器还不支持这些自动超时,
但是我们可以使用setTimeout( )和abort( )方法来实现自己的超时

/*
发起HTTP GET请求获取指定URL的内容
如果响应成功到达,则传入responseText给回调函数
如果响应在timeout时间内没有到达,则中止请求
浏览器可能会在abort()后出啊发readystatechange
如果部分请求结果到达,甚至可能设置status属性
所有需要设置一个标记,当部分且超时的响应到达时不会调用回调函数
如果使用load(当请求完成时触发)事件就没有这个风险
*/
function(url,timeout,callback){
    var request = new XMLHttpRequest();
    var time = false;//是否超时
    var timer = setTimeout(function(){
        timeout = true;
        request.abort();//请求中止
    },timeout);
    request.open("GET",url);
    request.onreadystatechange = function(){
        if(request.readyState !==4) continue;//忽略未完成的请求
        if(timeout) return;//忽略中止请求
        clearTimeout(timer);//取消等待的超时
        if(request.status === 200)
            callback(request.responseText);
    }
    request.send(null);
}
<think>我们正在回答用户关于“使用XMLHttpRequest捕获请求异常的方法”的问题。 根据提供的引用内容,我们需要提取与捕获异常相关的信息。 引用中提到: - XMLHttpRequest的基本用法(初始化、发送请求等)[^1][^2] - 使用abort()方法终止请求[^3] 但是,用户关心的是“捕获请求异常”,因此我们需要重点说明XMLHttpRequest的错误处理机制。 XMLHttpRequest对象提供了一些事件来监听请求状态,包括错误事件: - onerror: 当请求发生错误时触发(如网络错误) - onabort: 当请求被中止时触发(通过调用abort()方法) - ontimeout: 当请求超时时触发(需要设置timeout属性) 因此,捕获异常的方法主要是通过设置这些事件处理函数。 步骤: 1. 创建XMLHttpRequest对象 2. 设置请求(open方法) 3. 设置事件监听器(包括error, abort, timeout等) 4. 发送请求(send方法) 示例代码: ```javascript const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.example.com/data', true); // 设置超时时间(可选) xhr.timeout = 5000; // 5秒超时 // 监听错误事件 xhr.onerror = function() { console.error('请求发生错误'); }; // 监听超时事件 xhr.ontimeout = function() { console.error('请求超时'); }; // 监听中止事件 xhr.onabort = function() { console.warn('请求被中止'); }; // 也可以使用onload来监听成功完成 xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { console.log('请求成功', xhr.responseText); } else { // HTTP状态码错误,虽然请求完成,但可能是4xx或5xx console.error('请求失败,状态码:', xhr.status); } }; xhr.send(); ``` 注意:除了网络错误(触发onerror)外,我们还需要注意服务器返回的HTTP错误状态码(如404、500等),这些不会触发onerror事件,而是会触发onload事件(因为请求已经完成,只是返回了错误状态码)。因此,在onload事件中需要检查status状态码。 另外,我们还可以使用更古老的onreadystatechange事件,它会监听readyState的变化。当readyState变为4(请求完成)时,再检查状态码。 使用onreadystatechange的示例: ```javascript xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 300) { console.log('成功', xhr.responseText); } else { // 这里处理错误,包括HTTP状态码错误 console.error('请求失败', xhr.status); } } }; ``` 总结: - 网络错误(如跨域问题、断网等)会触发onerror。 - 超时会触发ontimeout。 - 主动调用abort()会触发onabort。 - 服务器返回错误状态码(如404、500)需要在onload或onreadystatechange中处理。 因此,捕获异常需要综合处理这些事件。 根据引用,我们没有找到直接关于异常捕获的引用内容,但根据XMLHttpRequest的标准用法,以上是常见的错误处理方式。 最后,生成相关问题: - 如何用XMLHttpRequest实现文件上传? - 如何取消XMLHttpRequest请求? - XMLHttpRequestFetch API在错误处理上的区别是什么? - 如何处理跨域请求中的错误? </think>### XMLHttpRequest 捕获请求异常的方法 XMLHttpRequest 提供以下几种方式捕获请求异常: #### 1. **`onerror` 事件处理** 处理网络层错误(如断网、跨域失败)的核心方法: ```javascript const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.example.com/data'); xhr.onerror = function() { console.error("网络请求失败", this.statusText); // 捕获网络错误 }; xhr.send(); ``` > ✅ 适用场景:DNS解析失败、CORS错误、断网等底层网络异常[^2] #### 2. **HTTP 状态码检查** 处理服务器返回的错误状态码(4xx/5xx): ```javascript xhr.onload = function() { if (this.status >= 400) { // 400+ 状态码视为错误 console.error(`HTTP错误: ${this.status} ${this.statusText}`); } else { console.log("请求成功", this.response); } }; ``` > ✅ 适用场景:验证服务器返回的 404/500 等错误状态[^1] #### 3. **`ontimeout` 超时监控** 设置超时阈值并捕获超时异常: ```javascript xhr.timeout = 5000; // 5秒超时 xhr.ontimeout = function() { console.error("请求超时"); }; ``` #### 4. **`onabort` 中断处理** 监控手动中止请求的情况: ```javascript xhr.onabort = function() { console.warn("请求已被中止"); }; // 手动中止请求 document.querySelector('button').addEventListener('click', () => xhr.abort()); ``` #### 5. **综合错误处理方案** 完整异常捕获示例: ```javascript function fetchData(url) { const xhr = new XMLHttpRequest(); xhr.open('GET', url); // 异常监控链 xhr.onerror = () => handleError('Network Failure'); xhr.ontimeout = () => handleError('Timeout'); xhr.onabort = () => handleError('Aborted'); xhr.onload = () => { if (xhr.status >= 400) { handleError(`HTTP ${xhr.status}`); } else { processData(xhr.response); } }; xhr.send(); function handleError(message) { console.error(`请求失败: ${message}`, { status: xhr.status, url: url }); } } ``` --- ### 关键注意事项 1. **跨域错误**:CORS 错误会触发 `onerror` 但无法读取具体响应头[^2] 2. **错误顺序**:`onabort` > `onerror` > `ontimeout` > `onload` 3. **状态码 0**:网络错误通常返回 `status=0`,需结合 `onerror` 处理 4. **兼容性**:超时设置(`timeout`)在 IE8+ 支持,完整错误捕获需 IE10+ > ⚠️ 重要提示:服务器错误(如500)不会触发 `onerror`,必须通过 `onload` 中的状态码检查[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值