使用$interval在AngularJS中每秒触发一次AJAX请求

3

当我点击最后一个元素时,间隔函数会一直循环在那个元素中。我希望发生的是,当我点击新元素时取消上一个间隔并重新启动所有元素的间隔函数。我在 ng-repeat 中单击每个项目。

这是我的代码:

$scope.onClickTab= function(x,tkid, sid, $event){
      var vtpostdata = 'TokenId=' + tkid +
                                ',SessionId=' + sid +
                                ',ChatMessageCount=' + 0 +
                                ',retrytimes=' + 10 +
                                ',delayms=' + 100;
  $interval(function() {
      $http.jsonp(ServiceDomainSite + 'myApi' + vtpostdata + '?callback=JSON_CALLBACK&t=' 
                                    + new Date().getTime())
            .success(function (data) {
              var resultObject = angular.fromJson(data.Rows);
              $scope.Chats = resultObject;    
            });
  }, 1000);
};
2个回答

3

使用$interval.cancel()非常好。我还删除了var vtpostdata,因为在你的$http请求再次发出之前没有使用它。所以在此时创建一个变量是没有必要的。同时,请查看AngularJS $interval文档,以了解更多关于$interval处理的信息。

var myInterval = null;

$scope.onClickTab = function(x,tkid, sid, $event){

    //cancel current interval
    if (myInterval !== null) {
        $interval.cancel(myInterval);
    }

    myInterval = $interval(function() {
        $http.jsonp(ServiceDomainSite + 'myApiTokenId=' + tkid +
        ',SessionId=' + sid +
        ',ChatMessageCount=' + 0 +
        ',retrytimes=' + 10 +
        ',delayms=' + 100 + '?callback=JSON_CALLBACK&t='
        + new Date().getTime()).success(function (data) {
            var resultObject = angular.fromJson(data.Rows);
            $scope.Chats = resultObject;
        });
    }, 1000);
};

@JohnWick 很高兴能帮助你。祝你有美好的一天。 - lin

1

$interval 服务返回一个可随时取消的 Promise,因此您可以根据官方文档使用它们。例如:

var stopTime = $interval(function(){}, 1000);

"而要取消,只需使用

"
$interval.cancel(stopTime);

https://docs.angularjs.org/api/ng/service/$interval


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接