0

次のコードで setIterval 関数を使用して配列のデータを XXX 秒ごとに表示する方法に関する問題を解決した後:

var iterations = 0,
    data = ['a','bbbbbbbb','c'],
    interval = setInterval(foo, 4000);

function foo() {
    console.log(data[iterations]);
    iterations++;
    if (iterations >= 4){
        clearInterval(interval);
    }else if(iterations == 1){
        //we want to make time longer in this iteration.
        clearInterval(interval);
        interval = setInterval(foo, 8000);
    }
}

物事をきれいにして、これらすべてを関数にカプセル化したいと思います。問題は、グローバル変数を関数に挿入すると、foo はすべての変数が不明であると言うので、それらを属性として渡す必要があることです。また、それを検出するために間隔をこれに変更しましたが、現在は機能しません。すべてのデータを同時に表示し、setIterval を無視しているようです

runTest();

function runTest(){
    var iterations = 0,
    data = [1,2,3,4,5],
    maxIterations = 5,
    interval = setInterval(foo(iterations,data,maxIterations),4000);    
}

function foo(iterations,data,maxIterations){
    var sentence = data[iterations];
    var div = d3.select('div').append('p').text(sentence);
    iterations++;
    if (iterations >= maxIterations){
        clearInterval(this);
    }else{
        clearInterval(this);
        interval = setInterval(foo(iterations,data,maxIterations),4000);
    }
}

Chromeデバッガーフローアプリにブレークポイントを設定すると、正しいようです。

どこに問題があるか知っていますか?ありがとう!

4

2 に答える 2

0

setInterval には、パラメーター (または関数参照) として関数が必要です。ただし、関数呼び出しの結果を foo に渡しています。

あなたはおそらく次のようなものが欲しい

var iterations = 0,
data = [1,2,3,4,5],
maxIterations = 5,
interval = setInterval(function() { foo(iterations,data,maxIterations); }, 4000);

ここでは、必要なすべてのパラメーターを指定して foo を呼び出す関数を渡しています。

于 2013-05-11T12:41:53.403 に答える