0

一連の関数を設定する関数がありsetTimeoutます。すべての関数が Array に追加されfuncsます。stopplay().clearTimeoutそれにもかかわらず、配列を使用してそれらを停止しようとすると、値がありません。

それらの機能にアクセスするにはどうすればよいclearTimeoutですか?

var funcs = new Array();    

function playWithDelay(){   
    for (var i = 0; i < PlayDatesArray.length; i++) { 
        funcs[i] = createfunc(i); 
    } 

    for (var j = 0; j < PlayDatesArray.length; j++) { 
        funcs[j]();
    } 
}

function createfunc(i) { 
    return function() {        
        setTimeout(function(){            
        //my function
      }, i*1500);        
    }; 
}

function stopplay(){    
    alert(this.funcs.count);
    for (var i = 0; i< funcs.count; i++){ 
        //things I tried
        var tmpFunction = funcs[i]; 
        //funcs[i].splice(i, 1);
        clearTimeout(tmpFunction);
        clearTimeout(funcs[i]);
        funcs[i]=tmpFunction;
    }    
}
4

2 に答える 2

3

clearTimeoutsetTimeout関数自体への参照ではなく、によって返された ID を取ります。

だからあなたが欲しいのは(ES5コードで)

var timeouts = [];

function createfunc(i) { 
  return function() {        
      return setTimeout(function(){            
      //my function
    }, i*1500);        
  }; 
}

// code to create the functions
function playWithDelay(){   
  for (var i = 0; i < PlayDatesArray.length; i++) { 
    timeouts.push(createfunc(i)());
  }
} 


// code to stop them
function stopplay(){ 
  timeouts.forEach(clearTimeout);
}
于 2012-10-24T00:21:48.400 に答える
1

からアクセスthis.funcsしていますstopplay()が、funcsは(少なくともこの例では)グローバル変数として定義されています。stopplay()を呼び出す呼び出しコードによっては、で作成されthisたグローバルスコープと同じスコープではありませんfuncs

ストッププレイを更新し、上で作成したアレイでアラートが表示されるかどうかを確認するように変更this.funcs.countします。funcs

また、funcsアレイに本当にありますcountか?length代わりに使ってみます。

function stopplay(){    
    alert(funcs.length);
    for (var i = 0; i< funcs.length; i++){ 
    ....
    }    
}

編集:

setTimeoutの戻り値を保存していないため、タイムアウトをクリアすることはできません。関数でclearTimeoutを渡しても、タイムアウトはクリアされません。

あなたはこのようなことをすることができます:

var timers = new Array();


function createfunc(i) { 
   return function() {        
      timers.push( setTimeout(function(){            
        //my function
      }, i*1500)) ;        
   }; 
}


function stopplay(){    
    for (var i = 0; i< timers.length; i++){ 
        clearTimeout(timers[i]);
    }    
}
于 2012-10-23T23:59:27.740 に答える