Nos documentos $http
do Angular, ele menciona que você pode definir a configuração ‘timeout’ para um número ou uma promise.
timeout – {number | Promise} – tempo limite em milissegundos ou promise que deve anular o pedido quando resolvido.
Mas não tenho certeza de como fazer isso funcionar usando uma promise. Como faço para definir um número e uma promise? Basicamente eu quero ser capaz de saber se uma chamada http (promise) com erro devido a um ‘tempo limite’ ou outra coisa. Eu preciso ser capaz de dizer a diferença. Obrigado por qualquer ajuda !!!
if (timeout > 0) { var timeoutId = $browserDefer(timeoutRequest, timeout); } else if (timeout && timeout.then) { timeout.then(timeoutRequest); } function timeoutRequest() { status = ABORTED; jsonpDone && jsonpDone(); xhr && xhr.abort(); }
timeout.then(timeoutRequest)
significa que quando a promise é resolvida (não rejeitada), timeoutRequest é invocado e xhr request é abortado.
Se a solicitação foi timeout, então reject.status === 0
( Nota: no caso de uma falha de rede, então reject.status
também será igual a 0 ), Um exemplo:
app.run(function($http, $q, $timeout){ var deferred = $q.defer(); $http.get('/path/to/api', { timeout: deferred.promise }) .then(function(){ // success handler },function(reject){ // error handler if(reject.status === 0) { // $http timeout } else { // response error status from server } }); $timeout(function() { deferred.resolve(); // this aborts the request! }, 1000); });
Eu tive uma espécie de pergunta, você pode verificar este link: Angular 1.5 timeout usando um HttpInterceptor sobre como implementar o tempo limite em um httpInterceptor. O jsFiddle está incluído no analisador. Todo o crédito vai para https://stackoverflow.com/users/3959997/mita para a resposta.
Eu estava trabalhando em um sistema embarcado e eu estava tendo hang outs de tempos em tempos, já que é um dispositivo físico para que fique ligado por dias / meses / anos usando $ timeout corrigido esse comportamento
Exemplo rápido (wrapper de tempo limite para promises http)
Módulo
var myApp = angular.module('myApp',['ngRoute']);
Serviço
var yourServiceModule = myApp.service('YourService', function ($http) { this.your_method = function (a) { return a*a}; });
Controlador
//just wrap your service,http call using $timeout $timeout(function() { //vanilla service call YourService.your_method().then( function (response) { //console.log("sync_with_cloud: "+ response); $scope.check_cloud_port_statuses_progress=100; //... }, function(data) { // Handle error here $rootScope.global_config_1 += "\nError(333): cant connect to cloud at "+Date.now();+"\n\n"; $scope.check_cloud_port_statuses_progress = -1; } ); }, 8);