我目前有一个函数,它使用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并且该框甚至没有出现
答案 0 :(得分:1)
您需要使用 setInterval()
来执行具有特定时间间隔的代码。使用 clearInterval()
取消 setInterval()
操作。
var i = 0,
param = 'hi';
var intr = setInterval(function(param) {
if (++i === 10)
clearInterval(intr);
console.log(param);
}, 3000, param);
&#13;
在您的情况下,您可以使用 Object.keys()
将对象键添加到数组中,然后在 setInterval()
内部,您可以使用索引获取它。 / p>
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;
答案 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);
答案 2 :(得分:1)
for循环将尽可能快地执行,因此您的超时将在t~=0 + timeout
调用,但不会引人注意。
您需要的是增加变量并将超时设置为variable*timeout
。
此外,对window.alert
的调用会停止执行脚本。您可能需要使用其他方式来显示您的信息框(如模态窗口):
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;