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