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
$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 .