【问题标题】:Execute method with Angular's $timeout in a for loop在 for 循环中使用 Angular 的 $timeout 执行方法
【发布时间】:2015-01-28 08:31:54
【问题描述】:

我正在学习 AngularJS。

我想做的是用 $timeout 在 for 循环中执行一个方法。

示例如下:

for(var i = 0; i < 10; i++) {
    $timeout(function(i) {
        someMethod(i);
    }, 1000);
}

function someMethod(i) {
    console.log('Executed : ', i);
}

但我不能传递变量“i”。我怎样才能做到这一点?另外,我也想知道如何用 Angular $interval() 解决这个问题。

谢谢!

【问题讨论】:

    标签: javascript angularjs timeout intervals


    【解决方案1】:

    您需要将它包装在一个闭包函数中,传入 i 变量,然后它将在该新函数的范围内可用..例如

    for(var i = 0; i < 10; i++) {
        (function(i){  // i will now become available for the someMethod to call
            $timeout(function() {
                someMethod(i);
            }, i * 1000);
        })(i); // Pass in i here
    }
    
    function someMethod(i) {
        console.log('Executed : ', i);
    }
    

    请记住,$timeout 只是 setTimeout 的一个包装器,用于可测试性。因此,请参阅 http://jsfiddle.net/f1yfy6ac/3/ 以了解此操作。

    如果您想改用 $interval,那么您可以使用:

    $interval(someMethod, 1000) 
    

    这无论如何都会传入 i 。你不需要循环使用它。

    【讨论】:

    • 感谢您的回复!但我希望 someMethod() 每秒调用一次 - 我该怎么做?
    • 例如,控制台类似:'Executed : 1'(1 秒后)'Executed :2'(1 秒后)...
    • 好的更新了它,这样它就可以工作了。但是有几种方法可以更好地实现这一目标。我建议使用docs.angularjs.org/api/ng/service/$interval
    • $interval 是迄今为止最好的解决方案。你不需要一个 for 循环来调用它。如果你想限制迭代次数,那么这是第三个参数。例如。 $interval(someMethod, 1000, 10)
    • 所以间隔只会在你给它的每一个时间跨度上增加。如果您在 for 循环中使用它,那么您将创建多个泵。所以一秒钟后你的函数会调用一次,两秒钟后它会被调用两次,三秒钟后它会被调用三次......有意义吗?
    【解决方案2】:

    使用 $interval:

    var i=0;
    $interval(function(){
        someMethod(i++);
    }, 1000, 10);
    
    
    function someMethod(i) {
        console.log('Executed : ', i);
    }
    

    使用 Dave 所说的自执行函数(带有 for 循环的 $interval): 您可以将所有调用的迭代次数限制为 1 作为 $interval 的第三个参数

    for(var i = 0; i < 10; i++) {
        (function(i){  
            $interval(function(){
                someMethod(i);
            }, 1000, 1);
        })(i); 
    }
    

    【讨论】:

    • 谢谢!但我想将它与 for 循环一起使用!你有更好的方法吗?
    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多