首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XMLHttpRequest send()捕获异步网络错误

从XMLHttpRequest send()捕获异步网络错误
EN

Stack Overflow用户
提问于 2014-08-20 08:44:03
回答 2查看 18.5K关注 0票数 9

我正在使用XMLHttpRequest异步发出一个http请求

代码语言:javascript
复制
xhr.open(method, uri, true);

当我发送something

代码语言:javascript
复制
xhr.send(something)

当服务器关闭时,它会抛出以下错误:

代码语言:javascript
复制
net::ERR_CONNECTION_REFUSED

如何捕获和处理此错误?标准的try..catch块无法工作,因为请求是异步的。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-20 09:01:20

使用XMLHttpRequestonerror事件

代码语言:javascript
复制
function aGet(url, cb) {
    var x = new XMLHttpRequest();
    x.onload = function(e) {
        cb(x.responseText)
    };
    x.onerror= function(e) {
        alert("Error fetching " + url);
    };
    x.open("GET", url, true);
    x.send();
}

var dmp = console.log.bind(console); // Dummy callback to dump to console
aGet("/", dmp) // Ok, uses onload to trigger callback
aGet("http://dgfgdf.com/sdfsdf", dmp); // Fails, uses onerror to trigger alert
票数 16
EN

Stack Overflow用户

发布于 2017-05-12 21:29:52

我为这个问题写了一个完整的解决方案。它工作得很完美!

我有一个名为networkOrfail的函数,如果网络可用,它将尝试每秒重新发送XMLHttpRequest。否则,它将忽略该请求。

当请求成功时,该轮询将停止并返回响应。

下面是检测网络是否可用的方法:

代码语言:javascript
复制
function getNavigatorConection() {
    return navigator.onLine;
}

然后,创建您的XMLHttpRequest

代码语言:javascript
复制
function makeRequest() {
    let xhr = new XMLHttpRequest();
    xhr.open('GET', 'anypage/anotherpage', true);
    xhr.timeout = 2000;
    xhr.onload = function () {
        // Your request is completed
        if (xhr.readyState == 4 && xhr.status == 200) {
            // You're in a successfully condition
        }
    };
    xhr.ontimeout = function (e) {
        // Your request timed out
    };
    xhr.send(null);
}

现在,按如下方式定义轮询方法:

代码语言:javascript
复制
function networkOrFail(callFunc, callTime) {
    let connected = getNavigatorConection();
    let callableTimes = callTime < 2000 ? 2000 : callTime;
    let toursBegin = 3;
    let tours = toursBegin;
    let intervalId;
    let request = function() {
        intervalId = setInterval(function() { 
        let connected = getNavigatorConection();
        if (tours > 0) {
            if (connected) {
                callFunc();
                tours =0;
                return false;
            }
            tours--;
            alert("i tryied againt to resend for another time and it remain just "+tours+" to retry");
        } else {
            clearRequest();
            tours =toursBegin;
        }
    }, callableTimes > 5000 ? 5000 : callableTimes);

    };
    let clearRequest = function() {
        clearInterval(intervalId);
        intervalId = null;
    };
    if (connected)
        callFunc();
    else
        request();
}

最后,通过轮询方法调用send方法,将其传递给其他超时时间(以分钟为单位):

代码语言:javascript
复制
networkOrFail(makeRequest, 5000);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25395119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档