$ Http angular: establecer una promesa en la configuración de ‘tiempo de espera’

En Angular $http docs , menciona que puede establecer la configuración de ‘timeout’ en un número o una promesa.

timeout – {number | Promise} – agote el tiempo en milisegundos, o prometa que debe abortar la solicitud cuando se resuelva.

Pero no estoy seguro de cómo hacer que esto funcione con una promesa. ¿Cómo establezco un número y una promesa? Básicamente, quiero saber si una llamada http (promesa) tuvo errores debido a un “tiempo de espera” u otra cosa. Necesito ser capaz de notar la diferencia. Gracias por cualquier ayuda !!!

Este código es del código fuente de $ 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 cuando la promesa se resuelve (no se rechaza) timeoutRequest se invoca y la solicitud xhr se cancela.


Si la solicitud fue reject.status === 0 entonces reject.status === 0 ( Nota: en caso de una falla de red, entonces reject.status también será igual a 0 ), Un ejemplo:

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

Tuve una especie de pregunta parecida, puede consultar este enlace: Angular 1.5 timeout usando un HttpInterceptor sobre cómo implementar el tiempo de espera en un httpInterceptor. jsFiddle está incluido en el awser. Todo el crédito va a https://stackoverflow.com/users/3959997/mita para la respuesta.

Estaba trabajando en un sistema integrado y tenía hangouts de vez en cuando ya que es un dispositivo físico, por lo que permanece encendido durante días / meses / años usando $ timeout corregido este comportamiento

Ejemplo rápido (contenedor de tiempo de espera para promesas de http)

Módulo

 var myApp = angular.module('myApp',['ngRoute']); 

Servicio

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