一个函数中的JavaScript setTimeout setInterval

时间:2010-03-17 17:42:58

标签: 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);
}

有了这两个功能,我可以打电话给

a=tout(itv());

并获得一个循环计时器,运行5.5秒,然后退出,基本上。



按照我的逻辑,这应该有效,但它根本不是

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

对此事的任何见解都将不胜感激。

3 个答案:

答案 0 :(得分:7)

它无法正常工作,因为您的setInterval将在超时后被调用!您的原始方法是正确的,您仍然可以将其包装成单个函数:

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

答案 1 :(得分:4)

我认为你犯的错误是函数itv没有返回setInterval(function(){ sys.puts('interval'); }, 1000)它执行setInterval(function(){ sys.puts('interval'); }, 1000)而是返回setInterval生成的ID。然后将该ID传递给clearInterval函数以停止setInterval(function(){ sys.puts('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);
}

答案 2 :(得分:1)

这是编写你的版本的另一种方法,你看到你将一个函数传递给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);
}

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