2013-07-26 41 views
17

我正在使用角度发送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”。超时检查状态== 0是否安全?

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

+1

我所知道的是'status === 0'确实没有**象征超时。它是服务器不使用时的代码'用正确的HTTP状态做出响应,或者不响应高。 – Blackhole

+2

这也是呼叫中止时的状态。 – Francisc

回答

19

我已经做了如下......

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 
     } 
    }); 
+2

很好的解决方法,但会检查数据== null和状态== 0没有改善的情况下,我们得到一个错误,只是在超时之前,然后检查在javaScript respTime将是> = config.timeout? if(data == null && status == 0 && respTime> = config.timeout) –

6

我刚刚通读源代码。在$httpBackend的源代码中,xhr.ontimeout未被处理。他们应该执行xhr.ontimeout

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

+2

angular支持http超时,问题是区分超时到其他网络相关的错误。 – Max

1

Angular's documentation,在timeout参数以毫秒为单位。

所以你在1毫秒设置它,这是非常低。这可能会使请求在99.9999%的情况下失败。

+0

谢谢。我更新了问题中的超时时间。 –