Comment définir un délai d'attente d'interrompre une $http.get() à l'intérieur d'une usine ou d'un service?
J'ai la méthode suivante getData(url)
dans mon usine qui utilise $http.get(url)
pour obtenir des données à partir d'une URL
angular
.module('az-app')
.factory('WebServiceFactory', function ($http, $q) {
var WebServiceFactory = this;
WebServiceFactory.getData = function (url) {
var deferred = $q.defer();
$http.get(url)
.then(
function (response) {
deferred.resolve({
data: response
});
}, function (rejected) {
deferred.reject({
data: rejected
});
}
);
//Promise to be returned
return deferred.promise;
}
Il fonctionne très bien mais j'ai besoin d'interrompre le http.obtenir et/ou le rejet de la promesse, afin que je puisse afficher un message d'erreur de mon contrôleur qui a cette méthode:
var getSpecialties = function (type) {
doctorsCtrl.showLoading();
var url = "example.com";
WebServiceFactory.getData(url)
.then(
function (result) {
doctorsCtrl.hideLoading();
var specialtiesArray = result.data.data;
StorageFactory.specialties = specialtiesArray;
doctorsCtrl.specialties = StorageFactory.specialties
//I WANT TO TRIGGER THIS REJECTED FUNCTION when timeout time is finished
}, function (rejected) {
doctorsCtrl.hideLoading();
doctorsCtrl.showAlert();
}
);
}
Vous devez vous connecter pour publier un commentaire.
Le service
$http
accepte, dans l'objet de configuration, untimeout
bien que des réponses aux questions que vous avez besoin. Jetez un oeil à la la documentation, en particulier la partie sur laconfig
objet:Notez également que vous êtes à l'aide de promesses dans un moyen inefficace. Ce qui suit est une promesse antipattern:
Vous pourriez avoir simplement:
Avec un délai d'attente de 3 secondes, il serait:
Service:
Contrôleur:
Notez également que vous appelez
hideLoading
à la fois en cas de succès et erreur. Vous pouvez appeler ça une fois, dans un enchaînés enfin gestionnaire:$http.get
. J'ai complété la réponse avec votre code, en espérant que c'est plus clair.WebServiceFactory.getD = function (url) { return $http.get(url, {timeout: 1000}); }
, mais comment puis-je déclencherfunction (rejected) {
au contrôleur si la promesse n'a pas été résolu après 1 seconde, ont passé? Je suis l'insertion de la console.log() pour voir quelle est la réponse, et même si il semble que c'est en prenant plus de 1 sec, il ne semble pas être le déclenchement de l'rejeté la fonction de contrôleurWebServiceFactory.getD = function (url) { return $http.get(url, {timeout: 10}); }
avis du 10 au délai d'attente, ne devrait-ce pas être si court pour déclencher le rejet d'une fonction au contrôleur depuis que je suis en train de faire un appel d'API qu'il semble prendre au moins 2 secondes, sûrement plus de 1 sec. Mais ce n'est pas le déclenchement de la rejeter fonction 🙁