Comment faire une nouvelle requête avec $ http.get toutes les 3 secondes et obtenir des données en dehors de la fonction

Je veux obtenir des données de cette page http://orbit5.ds.cs.umu.se:8888/vrio/debug/blk . les données de cette page sont mises à jour chaque fois que vous actualisez la page. Je voudrais donc avoir ces valeurs mises à jour. Afin de mettre à jour les valeurs, je pourrais utiliser $ timeout, mais je dois ensuite obtenir ces valeurs en dehors de getdata, car je veux ensuite les twigr à une autre fonction pour créer un graphique, sinon le graphique entier continuera à être rendu à chaque fois que la fonction mises à jour. et je ne peux pas obtenir les valeurs en dehors de la fonction. J’ai trouvé cette réponse sur stackoverflow, mais la plupart des réponses, autant que je sache, utilisent des données provenant de l’intérieur de la fonction.

Comment obtenir les valeurs mises à jour en dehors de la fonction JavaScript et les twigr à une autre fonction? Ou peut-être existe-t-il une autre meilleure approche pour résoudre ce problème?

mon code:

function getData(){ var data; $http.get(path).then(function(response){ data = response.data console.log(response.data) //works fine }) return data } console.log(data)//returns undefined 

Maintenant, si je veux mettre à jour la fonction avec $ timeout

J’aurais besoin de faire quelque chose comme ça

 $timeout(getData, 3000) 

maintenant, comment puis-je accéder à ces valeurs mises à jour?

Modifier:

 var myData = setInterval( function(){ $http.get(path).then(function(response){ return response.data['Block Devices'] }) }, 1000 ); console.log(myData) }); 

retourne 14 Je ne sais pas ce que c’est mais certainement pas les bonnes données

Utilisez $ q d’angular, vous devez injecter $ q comme dépendance,

 function getData(){ var deffered = $q.defer(); var data; $http.get(path).then(function(response){ data = response.data $q.resolve(data); }) return deffered.promise; } var getDataCall = getData(); getDataCall.then(function(data){ console.log(data); }) 

si vous souhaitez répéter cet appel, utilisez $interval(fn, delay, [count], [invokeApply], [Pass]);

voir doc https://docs.angularjs.org/api/ng/service/$interval

Essayez ceci pour répéter, (je n’ai pas essayé),

 function getData(){ var deffered = $q.defer(); var data; $http.get(path).then(function(response){ data = response.data $q.resolve(data); }) return deffered.promise; } $interval(function(){ getData().then(function(data){ console.log(data); }); },3000); 

Vous devez juste exécuter le code dans un intervalle:

 setInterval( function(){ $http.get(path).then(function(response){ console.log(response.data); // Update your page here }); }, 3000 ); 

Pour cela, vous voulez utiliser le module $interval Angular.

Vous avez essentiellement une fonction appelée getData qui utilise le module $http . Ensuite, dans la résolution de cette promesse, vous définissez $scope.chartData avec les nouvelles données.

Vous appelez ensuite cette fonction sur un intervalle:

 $interval($scope.getData, 3000); // every 3 seconds 

Vous n’avez pas besoin de $q si vous faites cela dans votre contrôleur, mais vous devriez probablement le retirer du contrôleur et le mettre dans un service, puis utiliser le module $q .

Voici une interrogation CodePen sur HTTP dans Angular avec une application complète Angular en tant que solution compatible avec le sharepoint terminaison fourni.

Mise à jour : si vous voulez l’appeler depuis une fonction externe en dehors de votre contrôleur, vous pouvez le faire en créant une fabrique utilisant $q et en l’injectant dans votre contrôleur. Le même exemple mais avec une fabrique: CodePen sur la scrutation HTTP en Angular (en utilisant une fabrique)

Vous noterez également la méthode $scope.getBytesWritten dans l’exemple avec la fabrique / service. Vous devez exécuter une fonction pour obtenir une partie des données. Le simple fait d’accéder à une propriété des données du graphique ne mettra pas à jour cette valeur unique. Veuillez vous reporter au CodePen sur l’interrogation HTTP en mode angular (à l’aide d’une usine) .

Salut,

Dans AngularJS, il existe un service appelé $ timeout , qui fait exactement ce que vous recherchez en une boucle.

Vérifiez toute la documentation officielle ici: documentation du service $ timeout

Utilisation du service $interval avec le service $http

Le service $http renvoie une promesse que vous pouvez utiliser pour le chaînage . Utilisez le service $interval pour créer de manière réitérée une nouvelle promesse et une chaîne à partir de cette promesse pour mettre les données mises à jour dans l’étendue.

Rendez cette promesse et enchaînez-la

 angular.module("myApp").controller("myVm", function($scope,$http,$interval) { var count = 0; function getHttpPromise(url) { var promise = $http.post(url); //return for chaining return promise; }; function updateScope(promise) { //chain from promise promise.then (function (response) { count++; $scope.currentCount = "Current response "+count; }); }; updateScope(getHttpPromise("/echo/json")); var intervalPromise = $interval( function(){ updateScope(getHttpPromise("/echo/json")); }, 1000 ); $scope.onStopUpdate = function () { $interval.cancel(intervalPromise); }); }); 

L’exemple ci-dessus contient une fonction getHttpPromise qui renvoie une promesse de chaînage . La fonction updateScope httpPromise pour mettre à jour l’étendue. L’exemple utilise ensuite le service $interval pour mettre à jour l’étendue toutes les 1 000 millisecondes.

Le service $interval renvoie également une promesse pouvant être utilisée pour le chaînage et l’annulation.

La DEMO sur JSFiddle .