Ich entwickle eine Angular-App, die lange Abfragen verwendet, um schnelle Aktualisierungen zu erhalten, wenn sich auf dem Server etwas ändert. Ich benutze $ Ressource wie dies die tatsächlichen Daten zu holen:Testen von Anwendungen, die lange Abfragen mit Winkelmesser verwenden
appServices.factory('Data', ['$resource',
function(){
return $resource('', {}, {
query: {"url": …, isArray: false}
});
}]);
Dann habe ich eine Dienstleistung, die Pflege der Lang-Abfrage dauert: Warten, dass die Daten geladen werden; Speichere sie irgendwo; Starten Sie nach einer Sekunde den nächsten langen Abfragezyklus:
app.factory(„DataLoader“, [„Data“, "$timeout", function(Data, $timeout) {
return {
loadData: function() {
var parent = this;
var data = Data.query({},
function(result) {
/* do something to the data,
* then start waiting for an update from the server again
*/
$timeout(function() {
parent.loadData();
}, 1000);
}
);
}
};
});
Es funktioniert wie ein Charme bisher.
Allerdings versuche ich jetzt, Winkelmesser Tests dafür zu schreiben. Das Problem ist: Der Server unterbricht die langen Abfrageanforderungen nach 30 Sekunden nur dann, wenn keine Änderungen an den Daten vorgenommen werden. Während ich auf neue Daten innerhalb des $ -Zeitlimits warte, wird das Zeitlimit überschritten, bevor irgendwelche Ergebnisse eintreffen.
Ich habe die letzte Stunde gegoogelt, aber es scheint keine Lösung zu geben, außer $ interval anstelle von $ timeout zu verwenden. Dies funktioniert in einem guten alten Polling-Setup (Abfrage alle 3 Sekunden, leere Ergebnisse vom Server, wenn es nichts Neues gibt). Um genau das zu vermeiden, habe ich lange Abfragen implementiert. $ Timeout ist nur die viel sinnvollere Option für mich.
Können Sie mir irgendwelche Tipps geben, wie man den Winkelmesser in dieser Umgebung erfolgreich laufen lässt?
Wenn Sie nicht '$ interval' verwenden wollen, dann _think_ Ihre einzige andere Option wäre die Deaktivierung der Synchronisation von Winkelmessern mit Angular. 'browser.ignoreSynchronization = true'; Nicht sicher, ob es eine andere Option gibt – Gunderson
Danke für den Hinweis, @Gunderson! Ich habe genau das getan und dann manuell gewartet, bis DOM-Elemente mit den erwarteten Bedingungen angezeigt werden. – fjc