如何在警报框打开时让setTimeout开始计数

时间:2015-10-19 02:42:22

标签: javascript jquery alert settimeout

我目前有一个函数,它使用setTimeout()函数内的alert()函数创建警报,并嵌套在for循环中。

所以它看起来像这样

for(i<10){
 setTimeout(function(param){
  alert(param);
 3000, param);
  i++
}

我执行此操作时遇到的问题是,在警报框中单击“确定”后,计时器才会开始计数。

因此弹出第一个警报,我点击确定,3秒后出现第二个框。

相反,我希望能够显示第一个警报,等待3秒,按确定,第二个警报立即显示

我该怎么做?

编辑:我试过setInterval而不是建议的setTimeout,但它似乎导致我陷入设置间隔循环?

这是我的代码:

for (var product in cart) {
    alert(product);
    setTimeout(function(item) {
        alert("Name: " + item + ": Quantity: " + cart[item]);
    }, i * 3000, product);
    i++;
}

我刚尝试用setInterval替换setTimeout,我也在之后尝试了clearInterval并且该框甚至没有出现

3 个答案:

答案 0 :(得分:1)

您需要使用 setInterval() 来执行具有特定时间间隔的代码。使用 clearInterval() 取消 setInterval() 操作。

&#13;
&#13;
var i = 0,
  param = 'hi';
var intr = setInterval(function(param) {
  if (++i === 10)
    clearInterval(intr);
  console.log(param);
}, 3000, param);
&#13;
&#13;
&#13;

在您的情况下,您可以使用 Object.keys() 将对象键添加到数组中,然后在 setInterval() 内部,您可以使用索引获取它。 / p>

&#13;
&#13;
var i = 0,
  cart = {
    car: 1,
    car1: 2,
    car2: 3,
    car3: 4,
    car4: 5,
    car5: 6,
    car6: 7,
    car7: 8,
    car8: 9,
    car9: 10
  },
  // getting object keys
  arr = Object.keys(cart);
// initializing interval
var intr = setInterval(function(p) {
  // getting value using key
  alert('Name : ' + p[i] + ' Quantity : ' + cart[p[i]]);
  // canceling interval
  if (++i === 10)
    clearInterval(intr);
}, 3000, arr);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

在迭代产品属性时更新为工作: 我通过保持setInterval并使用Object.keys(obj)

获得对象属性来简化
var products = {
    sexdoll: '$69',
    dog: '$0',
    soul: '$minimum wage'
}, keyedProducts = Object.keys(products);

var i=0, intval = setInterval(function() {
    alert(keyedProducts[i]);
    if(++i > keyedProducts.length-1) { clearInterval(intval) }
}, 3000);

http://jsfiddle.net/xybt1g9x/

答案 2 :(得分:1)

for循环将尽可能快地执行,因此您的超时将在t~=0 + timeout调用,但不会引人注意。

您需要的是增加变量并将超时设置为variable*timeout

此外,对window.alert的调用会停止执行脚本。您可能需要使用其他方式来显示您的信息框(如模态窗口):

&#13;
&#13;
var obj = {x:1, y:2, z:3}
var i = 0;
var now = performance.now();
for(var p in obj){
  setTimeout(function(){snippet.log(this +' __ '+  (performance.now()-now));}.bind(obj[p]), ++i*3000);
  }
&#13;
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;