对于没有setTimeout的循环延迟

For Loop Delay Without setTimeout

本文关键字:循环 延迟 setTimeout 于没      更新时间:2023-09-26

所以,这是我的问题。。。我在一个函数中有一个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循环又开始了,"i"不同了。

参见jQuery:等待/延迟1秒而不执行代码

你试过吗:

setTimeout(function (){
         flare1array[i].rotation.z += 0.01;
         }, 10); 

先使用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);

JSFiddle 上的类似示例

CCD_ 3返回CCD_ 4,该CCD_。在这里,我将一个计数器变量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);
}

更新的JSFiddle