为什么setInterval()不返回我的函数的返回值?

时间:2017-12-10 03:06:31

标签: javascript setinterval

我对编码非常陌生(2周的经验),所以请关注这段代码我的愚蠢问题。最终我希望它能够连续运行名为" timer,"它告诉我运行名为" add,"的函数需要多长时间。在我的屏幕上显示结果,然后在每次运行时更新结果。

function add(a,b){ 
  return a + b;
}

function timer(){
  var a = Math.floor(Math.random() * 101);
  var b = Math.floor(Math.random() * 101);
  var start = performance.now();
  add();
  var end = performance.now();
  var duration = end - start;
  return duration + ' milliseconds';
}

t = setInterval(timer,1000);

这似乎做的是返回数字" 1"之后什么都不做

现在当我更换

return duration + ' milliseconds' 

console.log(duration + ' milliseconds') 

它做我想要的,除了我不想使用console.log的原因是它在显示持续时间时跳转到新行而不是用新持续时间替换前一行。为了澄清,我不想要一个大的持续时间列表,每次运行时都会变长,我只显示一个持续时间,每次运行时都会更新并替换。

感谢您的帮助!

5 个答案:

答案 0 :(得分:2)

clearInterval是异步的,因此您不会以这种方式获得返回值。您要获取的号码是以后想要setInterval时的ID。

但是,让我们说有趣t = setInterval(...) 确实尝试返回您的价值。

您执行setInterval但是当发生这种情况时,t = ...内的代码尚未执行。那时它刚刚被放入队列中,但DIV的分配并没有等待。

也许这可以帮助https://code.tutsplus.com/tutorials/event-based-programming-what-async-has-over-sync--net-30027

答案 1 :(得分:0)

您将t设置为setInterval()

的返回值

documentation表示setInterval()返回以下内容:

  

timeoutID ...一个标识计时器的数字非零值

看起来你真正想要的是在t内的某处设置变量timer(),这样当setInterval()每1000ms调用一次时,它就会更新t。

答案 2 :(得分:0)

功能console.log附加到控制台。所以你必须清理控制台才能达到你想要的效果。

如果您使用的是chrome,请拨打

clear() 

前 计时器功能中的console.log()

希望有所帮助

答案 3 :(得分:0)

当你说

  

在屏幕上显示结果

我在想你可能只想更新一个元素的文本。如果您只是想跟踪它,您将需要使用定时器函数之外的变量并更新函数内的变量。正如其他人指出的那样,setInterval将返回一个ID,以便稍后检索该间隔。例如,如果您想停止计时器,则可以执行clearInterval(t);

我创建了一个代码段,每次都会更新屏幕上的持续时间:

function add(a,b){ 
  return a + b;
}

function timer(){
  var a = Math.floor(Math.random() * 101);
  var b = Math.floor(Math.random() * 101);
  var start = performance.now();
  add();
  var end = performance.now();
  var duration = end - start;
  document.getElementById('duration').innerHTML = duration + ' milliseconds';
}

t = setInterval(timer,1000);
Duration: <span id="duration"></span>

另外,请看一下,因为您不熟悉编码:How do I return the response from an asynchronous call?

答案 4 :(得分:0)

如果您希望在setInterval完成后收到通知,那么您可能需要使用承诺:

function add(a,b) { 
  return a + b;
}

function timer(delayTime) {
  return new Promise(
    function(resolve) {
      setInterval(
        function() {
          var a = Math.floor(Math.random() * 101);
          var b = Math.floor(Math.random() * 101);
          var start = performance.now();
          add();
          var end = performance.now();
          var duration = end - start;
          resolve(duration + ' milliseconds');
        }, delayTime
      );
    }
  );
}

timer(1000).then(
  function(t) {
    console.log(t);
  }
);