web-dev-qa-db-fra.com

Angular $ http: définition d'une promesse sur la configuration 'timeout'

Dans le Angular $http docs , il mentionne que vous pouvez définir la configuration 'timeout' sur un nombre ou une promesse.

timeout - {number | Promise} - timeout en millisecondes, ou promesse qui devrait abandonner la demande une fois résolue.

Mais je ne sais pas comment faire fonctionner cela en utilisant une promesse. comment définir un nombre et une promesse? Fondamentalement, je veux pouvoir savoir si un appel http (promesse) s'est trompé en raison d'un "timeout" ou autre chose. J'ai besoin de pouvoir faire la différence. Merci pour toute aide !!!

28
29er

Ce code provient de code source $ 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) signifie que lorsque la promesse est résolue (non rejetée) timeoutRequest est invoqué et la requête xhr est abandonnée.


Si la demande a expiré, alors reject.status === 0 ( Remarque: en cas de défaillance du réseau, alors reject.status Sera également égal à 0 ), Un exemple:

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);
});
35
Ilan Frumer

J'ai eu une sorte de question similaire, vous pouvez vérifier ce lien: délai d'attente angulaire 1.5 en utilisant un HttpInterceptor sur la façon d'implémenter le délai d'attente dans un httpInterceptor. jsFiddle est inclus dans la réponse. Tous les crédits vont à https://stackoverflow.com/users/3959997/mita pour la réponse.

2
Ben Croughs

Je travaillais sur un système embarqué et je rencontrais de temps en temps depuis son appareil physique, donc il reste allumé pendant des jours/mois/années en utilisant $ timeout a corrigé ce problème

Exemple rapide (wrapper de délai d'attente pour les promesses http)

Module

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

Un service

var yourServiceModule = myApp.service('YourService', function ($http) {
    this.your_method = function (a) { return a*a};
});

Manette

//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);
0
d1jhoni1b