2017-06-08 1 views
1

Ceci est une question basée sur ma question précédente here. Pour l'essentiel, j'ai utilisé la méthode $ q.all() pour résoudre plusieurs appels http. Ensuite, je filtre et fusionne les deux sources de données.

Tout cela fonctionne très bien. Mais je veux que l'un de mes deux flux se rafraîchisse toutes les 5 minutes. Normalement, je ferais cela en annexant la minuterie suivante à la fin de mon code

var timer = $scope.intervalFunction = function() { 
    $timeout(function() { 
     /* function to call $http.get again */ 
     $scope.intervalFunction(); 
    }, 300000) 
}; 
timer(); 
$timeout.cancel(timer); 

Ma question est, puisque je ne définit pas les appels http comme des fonctions distinctes, et je aussi « fusionner » les deux sources, Comment puis-je appeler l'une de ces sources seulement, puis mettre à jour en conséquence sans faire plusieurs copies d'éléments de liste (ce qui est arrivé à moi dans de nombreuses tentatives).

Merci!

jsFiddle here

Répondre

1

"Je veux un de mes deux alimentations pour rafraîchir toutes les 5 minutes". Je ne suis pas sûr que vous pouvez faire l'affaire avec l'une des deux demandes $q.all. Je peux juste vous conseiller de faire une autre demande en dehors de votre emballage $q.all et commencer $timeout pour cela après votre obtenir le résultat de la première demande $q.all.

besoin de dire que je ne suis pas absolument sûr dans cette solution parce que je ne l'ai pas testé, mais espérons que cela fonctionne:

$q.all(promises) 
    .then(function(response) { 
    metadata = response.metadataPromise.data; 
    metrics = response.metricsPromise.data; 
    joinMetadataAndMetrics(); 
    requestEveryFiveMinutes(); 
    }) 
    .catch (error) (function (error) { 
    console.log(error); 
    }); 

function requestEveryFiveMinutes() { 
    $interval(function() { 
    // here you can make the needed http request 
    yourRequest() 
     .then(function() { 
     // handle the response as needed 
     }) 
     .catch(function(err) { 
     console.log(err); 
     }) 
    }, 300000); 
} 

Et ne pas oublier d'injecter $interval dans votre contrôleur

+0

Je pense que vous avez raison. Je suis à la recherche de bons exemples, mais je suis à court. donc si je: Q.Tous de $ (promesses) .alors (fonction (réponse) { métadonnées = response.metadataPromise.data; \t \t métriques = response.metricsPromise.data; joinMetadataAndMetrics(); }). catch (erreur) (fonction (erreur) { console.log (erreur); }); Comment faire cette deuxième requête et activer un timeout $? – KateJean

+0

@KateJean, j'ai dit '$ timeout', mais je veux dire' $ interval'. Et j'ai mis à jour la réponse, vérifiez-la. –

+0

vous avez certainement raison. En effet - je suis capable d'obtenir l'appel à travailler toujours 5 minutes d'intervalle comme je le voulais. Cependant, au lieu des entrées de liste qui sont simplement mises à jour avec les nouvelles informations, les entrées de la liste apparaissent à nouveau avec les entrées précédentes. Donc, si j'ai 10 entrées le premier appel, je vais soudain avoir 20 le deuxième appel. J'ai mis la fonction joinMetadataAndMetrics() dans ma partie .then du requestEveryFiveMinutes() (parce que je pensais que la fusion de données devrait être refaite). Évidemment, cela provoque la répétition, mais je ne suis pas sûr de savoir comment le résoudre. – KateJean