0

私はこれに似たコードを持っています、それはいくつかの画像の中で動きます...それは動作しますがタイマーを尊重していないようです

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

}); 
4

3 に答える 3

4

いくつかのポイント:

  • iコールバックが呼び出されるまでにループの終わりの値を持ちます。
  • jQueryを使用して配列を反復処理するには、を使用します$.each(array,$(array).each(
  • 関数をループで定義する必要はありません
  • それぞれが、コールバックの2番目の引数として、および最初の引数として値としてインデックスを提供します。

だからあなたが欲しいのは実際にはこれだと思われます:

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));
}); 
于 2013-03-22T15:19:47.193 に答える
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);
}
于 2013-03-22T15:32:17.333 に答える
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/(コンソールログを確認してください)

于 2013-03-22T15:40:42.797 に答える