每个内部都有jquery setTimeout

时间:2013-03-22 15:18:03

标签: jquery settimeout each arrayiterator

我有一些与此类似的代码,它在一些图像中移动......它可以工作,但它似乎不尊重计时器

var i = 1;
var indexArray = array(1,2,3);
var timerx = new Array();

$( indexArray ).each(function( indexArraykey ) {

    function internalCallback ( i, indexArraykey ) {
        val = indexArray[indexArraykey];
        console.log("test " + i + val);
    }); 

    timerx[i] = setTimeout( internalCallback( i, indexArraykey ), i * 500000 );                     

    i++;

}); 

3 个答案:

答案 0 :(得分:4)

几点:

  • i在调用回调时具有循环结束的值。
  • 使用jQuery迭代数组,使用$.each(array,,而不是$(array).each(
  • 不必在循环中定义函数
  • 每个都将索引作为回调的第二个参数,并将值作为第一个参数。

所以看来你想要的实际上是这样的:

var indexArray = array(1,2,3);
var timerx = [];
$.each(indexArray, function( indexArrayValue, i ) {
    timerx.push(setTimeout(function(){
        console.log("test " + i + ' : ' + indexArrayValue);
    }, (i+1) * 500000));
}); 

答案 1 :(得分:1)

这是如此糟糕的设计,除了完全反js模式,甚至超越...... 为什么要一遍又一遍地定义相同的功能!!!

$(imgNumArray).each(function (indexArraykey) {
    (function (i) {
        timerx[i] = setTimeout(internalCallback(i, indexArraykey), i * 500000);
    })(i++);
});

function internalCallback(i, indexArraykey) {
    val = indexArray[indexArraykey];
    console.log("test " + i + val);
}

答案 2 :(得分:1)

我不是javascript专家,但看起来像internalCallback被调用而不是作为函数传递给setTimeout

试试这个:

var i = 1;
var indexArray = [3,6,9];
var timerx = new Array();

$( indexArray ).each(function( indexArraykey ) {

    function internalCallback ( i, indexArraykey ) {
        return function () {
            val = indexArray[indexArraykey];
            console.log("test " + i + val);
        }
    } 

    timerx[i] = setTimeout( internalCallback( i, indexArraykey ), i * 5000);                     

    i++;

}); 

这里是小提琴http://jsfiddle.net/Guxdz/2/(查看控制台日志)