对于没有setTimeout的循环延迟

时间:2014-07-31 15:48:47

标签: javascript arrays for-loop

所以,这是我的问题......我在一个函数中有一个for循环

var fan1 = function () {
for(var i=0; i<flare1base.length; i++) {            
    for(var i=0; i<200; i++)
        flare1base.rotation.z += 0.01;
    };
};

基本上应该这样做,相当简单,但是......我需要等待10毫秒才能再次添加旋转。问题是我不认为我可以使用setTimeout或只使用setInterval而不是整个for循环,因为它会对数组中的对象起作用,如果我这样做

f1 = setInterval("flare1array[i].rotation.z += 0.01",10);
setTimeout("clearInterval(f1)",2000);

它排队动作来旋转这个东西,但是当动作发生时,for循环再次出现并且&#34; i&#34;是不同的。

2 个答案:

答案 0 :(得分:0)

请参阅jQuery: Wait/Delay 1 second without executing code

你试过了吗?

setTimeout(function (){

         flare1array[i].rotation.z += 0.01;

         }, 10); 

答案 1 :(得分:0)

如何使用setInterval然后使用clearInterval?你可以这样做:

function rotate(max) {            
    var i = 0;
    return function () {
        flare1base.rotation.z += 0.01;         
        if (++i == max) clearInterval(id);        
    }
}

var id = setInterval(rotate(200), 10);

Similar example on JSFiddle

setInterval会返回id,稍后可以传递给clearInterval,以防止该操作无限期地继续。在这里,我将一个计数器变量i包装在一个闭包中,它跟踪内部函数被调用的次数。当它被称为max次时,它会停止。

顺便说一句,如果您知道flare1base.rotation.z的起始值是什么,那么每次调用函数时重新计算它会更好,而不是连续添加0.01,这是因为重复的浮点数增加可能是不精确的。例如,如果您知道它的开头,则可以执行flare1base.rotation.z = 0.01 * ++i;(并从if语句中删除增量。)

要将其扩展为项目数组,可以将整个过程包装在循环中。假设您的商品位于数组arr中:

function rotate(arr, idx, max) {    
    var i = 0;
    return function () {
        arr[idx] += 0.01;         
        if (++i == max) clearInterval(ids[idx]);        
    }
}

var ids = new Array(5);    
for (var i = 0; i < 5; ++i) {    
    ids[i] = setInterval(rotate(arr, i, 200), 10);
}

updated JSFiddle