题 以角$ http确定请求超时


我正在使用angular发送http请求,如下所示。

$http({
    url: url,
    params: params,
    method:'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    },
    timeout: 60000    //60 seconds
}).success(function(data, status, headers, config) {
    //do something 
}).error(function(data, status, header, config) {
    if(timedout){  //determine occurrence of timeout.
        //invoke timeout handler
    } else  
        //handle other error
    }
});

如何确定超时?

我观察到在这种情况下收到状态码“0”。检查status == 0 for timeout是否安全?

请注意,我不是在询问HTTP请求超时(状态码408)。


17
2017-07-26 05:57


起源


我只知道的是 status === 0 不 不 象征着超时。它是服务器没有响应正确的HTTP状态或根本没有响应时使用的代码。 - Blackhole
它也是呼叫中止时的状态。 - Francisc


答案:


我已经完成了如下...

var startTime = new Date().getTime();
$http.post(...)
    .success(function(resp, status, header, config) {...})
    .error(function(resp, status, header, config) {
        var respTime = new Date().getTime() - startTime;
        if(respTime >= config.timeout){
            //time out handeling
        } else{
            //other error hanndling
        }
    });

19
2018-01-03 09:29



很好的解决方法,但检查数据== null和状态== 0没有改善我们在超时之前得到错误然后检查javaScript respTime将> = config.timeout? if(data == null && status == 0 && respTime> = config.timeout) - Jürgen Bayer


我只是阅读了源代码。在源代码中 $ httpBackendxhr.ontimeout 没有被处理。他们应该实施 xhr.ontimeout

不幸的是,Angularjs现在不支持http超时处理。 :(


6
2017-08-10 05:24



angular确实支持http超时,问题是区分超时与其他网络相关的错误。 - Max


根据 Angular的文档timeout 参数以毫秒表示。

因此,您将其设置为1毫秒,这是非常低的。这可能会使请求在99.9999%的情况下失败。


2
2017-12-11 16:24



谢谢。我在问题中更新了超时。 - Bilal Mirza