2013-07-26 5 views
17

Ich sende eine HTTP-Anfrage mit eckigen wie unten.

$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 
    } 
}); 

Wie kann ich die Zeitüberschreitung feststellen?

Ich habe festgestellt, dass in diesem Fall der Statuscode "0" empfangen wird. Ist es sicher, Status == 0 für Timeout zu überprüfen?

Bitte beachten Sie, dass ich nicht nach HTTP Request Timeout (Statuscode 408) frage.

+1

Alles, was ich weiß, ist, dass 'status === 0 ** nicht ** ein Timeout symbolisiert. Es ist der Code verwendet, wenn der Server nicht funktioniert. t antwortet mit einem korrekten HTTP-Status oder antwortet nicht a hoch. – Blackhole

+2

Es ist auch der Status, wenn ein Anruf abgebrochen wird. – Francisc

Antwort

19

Ich habe es wie unten getan ...

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

Schöne Problemumgehung, aber würde die Überprüfung auf Daten == Null und Status == 0 nicht verbessern für den Fall, dass wir einen Fehler kurz vor dem Timeout bekommen und dann in javascript oder respTime einchecken wäre> = config.timeout? if (data == null && status == 0 && respTime> = config.timeout) –

6

Ich habe gerade den Quellcode gelesen. Im Quellcode der $httpBackend wird die xhr.ontimeout nicht behandelt. Sie sollten xhr.ontimeout implementieren.

Leider unterstützt Angularjs nicht die HTTP-Timeout-Behandlung für jetzt. :(

+2

angular unterstützt http Zeitüberschreitung, das Problem besteht darin, Zeitüberschreitung zu anderen Netzwerkfehlern zu unterscheiden. – Max

1

Nach Angular's documentation, die timeout Parameter in Millisekunden ausgedrückt wird.

So sind Sie es in 1 Millisekunden einstellen, das ist extrem niedrig. Dies wird wahrscheinlich die Anfrage in 99,9999% der Fälle fehlschlagen.

+0

Vielen Dank. Ich habe die Zeitüberschreitung in der Frage aktualisiert. –