Ich versuche AngularJS zu lernen. Mein erster Versuch, jede Sekunde neue Daten zu erhalten, hat funktioniert:
'use strict';
function dataCtrl($scope, $http, $timeout) {
$scope.data = [];
(function tick() {
$http.get('api/changingData').success(function (data) {
$scope.data = data;
$timeout(tick, 1000);
});
})();
};
Wenn ich einen langsamen Server simuliere, indem ich den Thread 5 Sekunden lang schlafe, wartet er auf die Antwort, bevor er die Benutzeroberfläche aktualisiert und ein anderes Zeitlimit festlegt. Das Problem ist, wenn ich das Obige neu geschrieben habe, um Angular-Module und DI für die Modulerstellung zu verwenden:
'use strict';
angular.module('datacat', ['dataServices']);
angular.module('dataServices', ['ngResource']).
factory('Data', function ($resource) {
return $resource('api/changingData', {}, {
query: { method: 'GET', params: {}, isArray: true }
});
});
function dataCtrl($scope, $timeout, Data) {
$scope.data = [];
(function tick() {
$scope.data = Data.query();
$timeout(tick, 1000);
})();
};
Dies funktioniert nur, wenn die Serverantwort schnell ist. Wenn es eine Verzögerung gibt, spammt es 1 Anfrage pro Sekunde aus, ohne auf eine Antwort zu warten, und scheint die Benutzeroberfläche zu löschen. Ich denke, ich muss eine Rückruffunktion verwenden. Ich habe es versucht:
var x = Data.get({}, function () { });
habe aber einen Fehler bekommen: "Fehler: destination.push ist keine Funktion" Dies basierte auf den Dokumenten für $ resource, aber ich habe die Beispiele dort nicht wirklich verstanden.
Wie mache ich den zweiten Ansatz?
quelle
Neuere Versionen von Angular haben $ interval eingeführt, das sogar noch besser als $ timeout für Serverabfragen funktioniert .
quelle
Hier ist meine Version mit rekursivem Polling. Dies bedeutet, dass auf die Serverantwort gewartet wird, bevor das nächste Timeout eingeleitet wird. Wenn ein Fehler auftritt, wird die Abfrage fortgesetzt, jedoch entspannter und entsprechend der Dauer des Fehlers.
Demo ist da
Hier mehr darüber geschrieben
quelle
Wir können es einfach mit dem $ interval-Dienst abrufen. Hier ist ein detailliertes Dokument über $ interval
https://docs.angularjs.org/api/ng/service/$interval. Das
Problem bei der Verwendung von $ interval besteht darin, dass Sie $ http-Serviceaufrufe oder Serverinteraktionen ausführen und sich um mehr als $ Intervall verzögern Bevor Ihre eine Anfrage abgeschlossen ist, wird eine weitere Anfrage gestartet.
Lösung:
1. Das Abrufen sollte ein einfacher Status sein, der vom Server wie ein einzelnes Bit oder ein leichtes JSON abgerufen wird, und sollte daher nicht länger dauern als die definierte Intervallzeit. Sie sollten auch die Intervallzeit entsprechend definieren, um dieses Problem zu vermeiden.
2. Irgendwie passiert es aus irgendeinem Grund immer noch. Sie sollten ein globales Flag überprüfen, ob die vorherige Anforderung beendet wurde oder nicht, bevor Sie andere Anforderungen senden. Dieses Zeitintervall wird übersehen, aber die Anforderung wird nicht vorzeitig gesendet.
Auch wenn Sie einen Schwellenwert festlegen möchten, der nach einem bestimmten Wert ohnehin abgefragt werden soll, können Sie dies folgendermaßen tun.
Hier ist ein Arbeitsbeispiel. hier ausführlich erklärt
quelle