JavaScript setInterval()方法无法正常运行

时间:2019-02-22 08:16:17

标签: javascript loops

我有一个错误字符串数组,这些错误是提交后表单中的错误。

我想在固定时间后(每5秒说一次)将这些错误显示为一个通知。

我拥有的代码是:

var array = ["1", "2", "3", "4", "5", "6"];
recursive();

function recursive() {
  var error = array.pop();
  if (typeof error === 'undefined') {
    return;
  } else {
    console.log(error);
    //         showNoti(error);
  }
  setInterval(function() {
    recursive()
  }, 5000);
}

此代码的问题在于,它在前两个迭代中运行良好,在打印6秒钟后5秒钟打印出了5个。

但是在第三次迭代中,它同时打印字符串4和3。类似于第四次迭代。

如何修复它,以便每5秒打印一次数组中的每个元素?

4 个答案:

答案 0 :(得分:3)

当前,每次recursive的调用都在初始化另一个间隔。因此,例如,在第一次调用之后,将运行一个间隔:在第二次调用之后,将初始化另一个间隔(两个间隔),等等。

setInterval放在recursive之外:

var array = ["1", "2", "3", "4", "5", "6"];
recursive();

function recursive() {
  var error = array.pop();
  if (typeof error === 'undefined') {
    return;
  } else {
    console.log(error);
    //         showNoti(error);
  }
}
setInterval(function() {
  recursive()
}, 500);

或改用setTimeout

var array = ["1", "2", "3", "4", "5", "6"];
recursive();

function recursive() {
  var error = array.pop();
  if (typeof error === 'undefined') {
    return;
  } else {
    console.log(error);
    //         showNoti(error);
  }
  setTimeout(recursive, 500);
}

答案 1 :(得分:2)

setInterval移到recursive之外。每次运行recursive时,您都在创建一个新的setInterval

var array = ["1", "2", "3", "4", "5", "6"];
recursive();

function recursive() {
  var error = array.pop();
  if (typeof error === 'undefined') {
    return;
  } else {
    console.log(error);
    // showNoti(error);
  }
}

setInterval(recursive, 5000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

答案 2 :(得分:1)

在所有递归调用中,都会初始化新的setInterval。将其移出递归函数或使用setTimeout

var array = ["1", "2", "3", "4", "5", "6"];
recursive();

function recursive() {
  var error = array.pop();
  if (typeof error === 'undefined') {
    return;
  } else {
    console.log(error);
    //         showNoti(error);
  }
}
 setInterval(function() {
    recursive()
  }, 5000);

答案 3 :(得分:1)

select t1.volume_band, count(distinct(t1.user_id) ... where count(distinct(t1.volume_band)) = 1 将启动一个无限重复的计时器。在这种情况下,您可以控制是否要在代码中重复。

这就是'setTimeout'的用途-一个延迟的执行。

var chart = new google.visualization.LineChart(document.querySelector('#chartContainer')); google.visualization.events.addListener(chart, 'error', function (googleError) { google.visualization.errors.removeError(googleError.id); //here you can write your custom message or nothing if you want remove alert("error catch") }); chart.draw(yourData, yourOptions); 更改为setInterval

setInterval