2016-04-29 3 views
0

Lange Zeit lurker; Poster zum ersten Mal.

Meine Anforderung ist es, einen Server kontinuierlich (via http get) abzufragen und die Antworten im Browser anzuzeigen. Ich benutze angular 1.5. Ich habe einen logischen Fehler, der die Speicherbereinigung daran hindert, Speicher freizugeben. I denke, Ich habe es auf meine (falsche?) Nutzung von $ Intervall heruntergekocht.

Könnte jemand bitte mir helfen zu verstehen, was ich falsch mache? mein script.js

Hier:

var myApp = angular.module('myApp', []); 

myApp.controller('MyCtrl', ['$scope', '$interval', function($scope, $interval) { 

    $scope.counter = 0; 

    angular.element(document).ready(function() { 
     $interval(function() { 
      theWatcher() 
     }, 100); 
    }); 

    var theWatcher = function() { 
     $scope.counter++; 
    }; 

}]); 

meine index.html hier:

<!DOCTYPE html> 
<html ng-app="myApp"> 
<head> 
    <link data-require="[email protected]" data-semver="1.5.3" rel="stylesheet" href="Bootstrap" /> 
    <script data-require="[email protected]" data-semver="1.5.3" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="script.js"></script> 
</head> 
<body ng-controller="MyCtrl"> 
    <h1>Hello Plunker! {{counter}}</h1> 
</body> 
</html> 

A plunker

Chrome developer tools JS Heap Timeline over 90 seconds (Beachten Sie, wie die Garbage Collection Tritte in, aber es scheint nie zu sammeln alles, ich hätte mit der Zeit ein Sägezahnmuster erwartet.)

Antwort

0

$interval hat eine statische Funktion namens cancel([promise]). Verwenden Sie es, wenn Sie fortlaufende $interval Instanzen bereinigen möchten (es akzeptiert auch ein einzelnes Versprechen).

Arbeiten plunkr

+0

Muli, vielen Dank für Ihre Antwort. Basierend auf Ihrem Vorschlag, das Versprechen zu stornieren, habe ich meinen Beispielcode von $ interval zu $ ​​timeout verwenden geändert. Nach jedem Timeout annulliere ich das vorherige Versprechen und setze es auf undefiniert. Aber meine Probleme bestehen immer noch. Die Müllsammlung erholt sich nie, was ich glaube, dass es sollte und der Javascript-Heap wächst weiter. Neuer Plunker [https://plnkr.co/edit/NhGdi3Q6djt3iMPHIhd1?p=preview] – SlowFatRunner

+0

$ timeout wird nur einmal passieren, das wollen Sie nicht. Sie möchten ständig laufende Umfragen, die vom Client initiiert wurden. Das ist perfekt für '$ interval'. Ich habe meine Antwort geklärt - schau es dir an. –

+0

Muli, nochmals vielen Dank für Ihre Antwort. Ich habe niemanden hier bei der Arbeit, dem ich diese Fragen stellen kann. Ihr Plunkr ist sehr hilfreich. Es zeigt jedoch das Problem der Speicherbereinigung, die nicht den gesamten Speicher zurückfordert. Im Laufe von 60 Sekunden gibt es laut Chrome-Timeline 3,9 MB. Hier ist eine Bildschirmaufnahme der Chrome-Timeline auf Ihrem Plunkr: [http://imgur.com/4PjWbRd]. Vielleicht ist es möglich, dass das Beste ist, was wir mit Angular tun können? Vielleicht sollte ich in Betracht ziehen, mit rohen Javascript für diesen Polling-Mechanismus zu gehen. – SlowFatRunner

Verwandte Themen