setTimeval函数内部的setTimeout奇怪行为

时间:2018-07-16 08:12:06

标签: javascript settimeout setinterval

使用此代码,我得到了一些(对我而言)意外的行为:

setInterval(function() {
  console.log('Interval running');

  setTimeout(function() {
    console.log('TimeOut called');
  }, 5000);

}, 2000);

setInterval运行正常(每2秒),但是setTimeout仅在第一次运行(5秒后)运行,然后在2秒后开始运行? :/

我在这里想念什么?

2 个答案:

答案 0 :(得分:3)

每2秒,您将超时设置为从该时间点起5秒后发生的事情。

这意味着事件将在

发生
  • 2 + 5 = 7秒
  • 4 + 5 = 9秒
  • 6 + 5 = 11秒
  • ...等等。

这是您看到的行为。

答案 1 :(得分:1)

根据setInterval doesn't acutally run the function after the delay,而不是在延迟之后,它将功能添加到事件堆栈中,以便处理器能够尽快运行它。如果proc忙于其他操作,则实际运行将花费比延迟时间更长的时间。 因此,您会遇到延迟。

setInterval(function() {
  console.log('Interval running');

  setTimeout(function() {
    console.log('TimeOut called');
  }, 5000);

}, 2000);
263
3VM527:2 Interval running
VM527:5 TimeOut called
VM527:2 Interval running
VM527:5 TimeOut called
VM527:2 Interval running
VM527:5 TimeOut called
VM527:2 Interval running