5

我想我可能太累了,但我一辈子都无法理解这一点,我认为这是由于缺乏 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);
}

对此问题的任何见解将不胜感激。

4

3 回答 3

9

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

var dotime=function(){
  var iv = setInterval(function(){
    sys.puts("interval");
  }, 1000);
  return setTimeout(function(){
    clearInterval(iv);
  }, 5500);
};
于 2010-03-17T18:02:16.237 回答
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=函数(){
 // 开始我们的间隔并保存 id
 var intervalId = setInterval(function(){
  // 这将在每个时间间隔执行
  sys.puts("间隔");
 }, 1000);

 // 启动我们的超时函数
 设置超时(函数(){
  // 这将在超时发生时执行
  clearInterval(intervalId); // 停止间隔不再发生
 }, 5500);
}
于 2010-03-17T17:59:21.547 回答
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);
}

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

于 2010-03-17T18:05:08.273 回答