2013-03-22 4 views
0

у меня есть некоторый код, подобный этому, что движется внутри некоторых изображений ... это работает, но это, кажется, не соблюдать таймерJQuery SetTimeout внутри каждого

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++; 

}); 
+1

Почему бы вы определили функцию в цикле? – kidwon

ответ

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)); 
}); 
+0

Использование '});' для завершения 'internalCallback' неверно. =) Приведет к синтаксической ошибке. – hjpotter92

+0

Извините, опечатка, код работает. я пытаюсь изменить, и он не работает, но в журнале правильный номер – 2013-03-22 15:41:50

+0

@ al404 на самом деле кунал увидел еще одну проблему (я тоже редактировал). –

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); 
} 
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/ (проверьте журнал консоли)

+0

+1 Я еще не заметил эту проблему. –

+0

+1 спасибо вам тоже, даже если на самом деле не совсем понятно, почему :-) – 2013-03-22 15:56:12