最近,我一直在为angularJS中的Long polling苦苦挣扎。我过去有这段代码:

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();
});


这在我使用一些php脚本时有效。接下来,我希望它可以按角度工作,并创建了以下内容:

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();

}


出于测试目的,我没有包含url,而是在控制台中检查了404错误。我使用$ interval设置5秒间隔,这是它创建了多个运行该间隔的线程(看起来像它,如果我错了,请纠正我)。因此,我浏览了一些StackOverflow主题,并尝试将一种解决方案应用于我的代码,如下所示:

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();

}


这个问题是间隔不起作用,它看起来像只是一种常规的递归方法,每秒运行数千次。我需要找到一个解决方案,在该解决方案中,我可以对某些URL进行长时间轮询而无需重复线程。我怎样才能做到这一点?

最佳答案

省略括号就可以了:

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


括号的意思是“正确调用此函数”。 $interval期望的是回调,而不是函数调用的结果。

09-12 00:31