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

clearTimeout接受 id 返回的 id setTimeout,而不是对函数本身的引用。

所以你想要的是(在 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.countfuncs查看您在上面创建的数组是否会发出警报。

另外,你确定你的 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 回答