Angular $ timeout只调用一次函数

时间:2016-01-19 20:58:37

标签: angularjs timeout

我正在使用AngulaJs和Ionic。

我试图每隔3秒调用一次函数10次(这就是为什么我没有使用$ interval)。事实是,下面的代码只调用一次函数(调用控制台的调试代码被调用10次)。

for (i = 0; i < 10; i++)
 {
   $timeout(function () {
     $scope.play(); // this is the called function
     console.log("progress bar: " + i);
   }, 3000);
 }

任何帮助将不胜感激,

提前致谢,

Pagugim

3 个答案:

答案 0 :(得分:4)

For循环将一起启动10个超时。但似乎你希望他们一个接一个地执行。对于这种情况,您可以使用递归。

var count = 0;
replay();

function replay() {

    $timeout(function () {
     if(count < 10) {
         $scope.play();
         count++;
         replay(); // call this function again
         console.log("progress bar: " + $scope.progressVal);
     }
    }, 3000);
}

答案 1 :(得分:4)

  

我试图每隔3秒调用一次函数10次

您可以使用count的可选$interval参数。

var i=0;
function reportProgress() {
    $scope.play(); // this is the called function
    console.log("progress bar: " + i);
    i++;
};
$interval(reportProgress, 3000, 10);

来自文档:

  

$间隔

     

用法   $interval(fn, delay, [count], [invokeApply], [Pass]);

     

count (可选)重复的次数。如果未设置,或0,将重复          无限期。 (默认值:0)

- AngularJS $interval API Reference

答案 2 :(得分:1)

实际上,$scope.play()被称为10次,但几乎同时被召唤。要每隔3秒调用一次该函数,您可以使用闭包来保持值i并将超时设置为3000*i。我想这就是你想要的:

for (i = 0; i < 10; i++) {
    (function(i) {
        $timeout(function() {
            $scope.play();
            console.log("progress bar: " + i)
        }, 3000 * i);
    })(i);
}

Jsfiddle:https://jsfiddle.net/ealonwang/ens9wu0g/15/。每3秒观察一次值和控制台日志更改。