Angular $ http: definindo uma promise na configuração ‘timeout’

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 !!!

Este código é do código-fonte $ httpBackend :

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