Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript setTimeout setInterval在一个函数内_Javascript_Anonymous Function_Setinterval - Fatal编程技术网

JavaScript setTimeout setInterval在一个函数内

JavaScript setTimeout setInterval在一个函数内,javascript,anonymous-function,setinterval,Javascript,Anonymous Function,Setinterval,我想我可能过度疲劳了,但我一生都无法理解这一点,我认为这是因为缺乏javascript知识 var itv=function(){ return setInterval(function(){ sys.puts('interval'); }, 1000); } var tout=function(itv){ return setTimeout(function(){ sys.puts('timeout'); clearInterval(itv); }, 5500); } 通

我想我可能过度疲劳了,但我一生都无法理解这一点,我认为这是因为缺乏javascript知识

var itv=function(){
 return setInterval(function(){
  sys.puts('interval');
 }, 1000);
}
var tout=function(itv){
 return setTimeout(function(){
  sys.puts('timeout');
  clearInterval(itv);
 }, 5500);
}
通过这两个函数,我可以调用

a=tout(itv());
让一个循环计时器运行5.5秒,然后基本上退出



按照我的逻辑,这应该行得通,但根本不行

var dotime=function(){
 return setTimeout(function(){
  clearInterval(function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  });
 }, 5500);
}

对这件事有任何见解都将不胜感激。

我认为您犯的错误是,
itv
函数没有返回
setInterval(function(){sys.puts('interval');},1000)
它执行
setInterval(function(){sys.puts('interval');},1000)
,然后返回setInterval生成的ID。然后将该ID传递给
clearInterval
函数,以停止
setInterval(function(){sys.put('interval');},1000)
正在执行的操作

编辑:一个可行功能的示例

var dotime=function(){ // Start our interval and save the id var intervalId = setInterval(function(){ // This will get executed every interval sys.puts("interval"); }, 1000); // Start our timout function setTimeout(function(){ // This will get executed when the timeout happens clearInterval(intervalId); // Stop the interval from happening anymore }, 5500); } var dotime=函数(){ //开始我们的间歇并保存id var intervalId=setInterval(函数(){ //这将在每个间隔执行 系统看跌期权(“区间”); }, 1000); //启动我们的timout功能 setTimeout(函数(){ //这将在超时发生时执行 clearInterval(intervalId);//停止间隔的发生 }, 5500); }
它无法工作,因为您的
setInterval
将在超时后调用!您最初的方法是正确的,您仍然可以将其包装为单个函数:

var dotime=function(){
  var iv = setInterval(function(){
    sys.puts("interval");
  }, 1000);
  return setTimeout(function(){
    clearInterval(iv);
  }, 5500);
};

这是编写您的版本的另一种方法,您可以看到您将函数传递给clearInterval,在这里您应该传递一个计时器id

var dotime=function(){
 var g=function(){
  var f=function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  }
  clearInterval(f);
 }
 return setTimeout(g, 5500);
}
要使其正常工作,应调用以下函数:

  clearInterval(f());
或者,使用您的版本:

var dotime=function(){
 return setTimeout(function(){
  clearInterval(function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  }());
 }, 5500);
}

免责声明:我没有对此进行测试。

这绝对是正确的。在超时回调执行之前,他不会创建间隔。谢谢你的叫醒电话/简洁的回答,我不知道我在想什么