$超时不适用于AngularJs

时间:2018-07-17 08:41:03

标签: angularjs timeout

这是我的代码:

JS:

var timer;
$scope.getapi_url = function (n) {
    var url = n;
    $http({
            method: 'GET',
            url: url,
        })
        .then(function successCallback(data) {
            $scope.data = data.data;
            console.log($scope, data);
            timer = $timeout($scope.getapi_url(n), 5000); 
            // passing n if you don't want check n value on starting of function.
        }, function errorCallback(response) {
            $scope.errorBackend = true;
            console.log(response);
            console.log('error');
        });
};

HTML:

<button class="btn btn-clear btn-sm" ng-click="getapi_url('myurl') ">Click!</button>

点击getapi_url后,我的$timeout在5秒钟后没有超时,但是就像每时每刻。为什么? 谢谢您提前回答!

3 个答案:

答案 0 :(得分:3)

调用AngularJS的超时包装器的方法是:

$timeout([fn], [delay], [invokeApply], [Pass]);

您需要传递函数处理程序或将anon函数直接写入fn,而是在调用该函数。

使用:

$timeout($scope.getapi_url, 5000, false, n); 

通过传递n作为参数来调用函数。

或直接编写anon函数代替fn:

$timeout(function(){
  $scope.getapi_url(n)
}, 5000);

答案 1 :(得分:1)

您在这里犯了一个微妙的错误。

您无需设置$timeout即可在5000毫秒后调用getapi_url,而是通过以下操作立即调用getapi_url方法:

$scope.getapi_url(n)

在此行:

$timeout($scope.getapi_url(n), 5000)

实际上,您刚刚调用了两个函数,第一个是; $scope.getapi_url(n),第二个存在; $timeout()

如果您对代码进行以下调整,则getapi_url的5000 {ms}时间段过后,您的$timeout方法将被调用:

function successCallback(data) {

    $scope.data = data.data;
    console.log($scope, data);

   // This is calling getapi_url immediately, at the point of creating your timeout
   // timer = $timeout($scope.getapi_url(n), 5000); 

   // You should do this instead
   timer = $timeout(function() {
        $scope.getapi_url(n);
   }, 5000);
}

答案 2 :(得分:0)

尝试

timer = $timeout(function(){ $scope.getapi_url(n)}, 5000);