2016-06-07 12 views
0

Kürzlich habe ich mit Long Polling in angularJS gekämpft. Ich hatte diesen Code in der Vergangenheit funktioniert:Lange Polling Probleme in eckigen

function longPulling(){ 

$.ajax({ 
    type: "GET", 
    url: "someScript.php", 

    async: true, 
    cache: false, 
    timeout:50000, 

    success: function(data){ 
     appendMessage("new", data); 
     setTimeout(
      longPulling, 
      1000 
     ); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown){ 
     appendMessage("error", textStatus + " (" + errorThrown + ")"); 
     setTimeout(
      longPulling, 
      15000); 
    } 
}); 
}; 

$(document).ready(function(){ 
    longPulling(); 
}); 

Und das funktionierte, wenn ich einige PHP-Skript verwendet. Als nächstes wollte ich dies in Winkel arbeiten, und ich erstellt die folgenden:

angular.module("WIMT").controller('overviewController', function ($scope,$interval,$http){ 

$scope.longPolling = function(){ 
    $http({ 
     method: 'GET', 
     url: '/someUrl' 
    }).then(function successCallback(response) { 
     $interval(function(){ 
      $scope.longPolling(); 
     },5000) 
    }, function errorCallback(response) { 
     $interval(function(){ 
      $scope.longPolling(); 
     },5000) 
    }); 
}; 

$scope.longPolling(); 

} 

Zu Testzwecken habe ich nicht eine URL und überprüft die Konsole für 404 Fehler enthalten. Ich habe $ interval verwendet, um 5 Sekunden Intervalle zu setzen, das Problem dabei war, dass es mehrere Threads erstellt hat, die das Intervall laufen lassen (sah so aus, korrigiere mich wenn ich falsch liege). So durchsuchte ich einige Themen und versuchte Stackoverflow eine der Lösungen zu meinem Code anwenden, wie folgt aussehen:

angular.module("WIMT").controller('overviewController', function ($scope,$interval,$http){ 
var promise; 

$scope.start = function() { 
    $scope.stop(); 

    promise = $interval($scope.longPolling(), 5000); 
}; 

$scope.stop = function() { 
    $interval.cancel(promise); 
}; 

$scope.longPolling = function(){ 
    $http({ 
     method: 'GET', 
     url: '/someUrl' 
    }).then(function successCallback(response) { 
     $scope.start(); 
    }, function errorCallback(response) { 
     $scope.start(); 
    }); 
}; 

$scope.start(); 

} 

Das Problem mit dieser ist, dass das Intervall nur nicht funktioniert, es lookes mag seine nur eine reguläre rekursive Methode, die tausende Male pro Sekunde ausgeführt wird. Ich muss eine Lösung finden, wo ich lange Abfragen zu einer URL ohne doppelte Threads durchführen kann. Wie kann ich das machen?

Antwort

1

Lassen Sie die Klammer und Sie sind fein:

promise = $interval($scope.longPolling, 5000); 

Die Klammern bedeuten „Mit dieser Funktion Recht, die Art und Weise rufen“. Was $interval erwartet, ist ein Rückruf, nicht das Ergebnis des Funktionsaufrufs.

+0

Danke, ich wusste nicht, dass es so funktioniert. –

+1

Kein Problem, 11 von 10 Javascript-Entwicklern haben sich dieses Problem einmal gestellt. –

Verwandte Themen