2015-10-19 18 views
0

我目前有一個函數,它使用setTimeout()函數內部的alert()函數創建警報,並嵌套在for循環中。如何讓setTimeout在警告框打開後立即開始計數

因此,它看起來像這樣

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

你應該使用'setInterval',而不是你做了什麼。另外,您的for循環無效。它應該是一個while循環,如果有的話...... –

+0

哪裏是項目被定義? –

+0

爲什麼在setTimeout中有三個參數? –

回答

1

您需要使用setInterval()執行代碼具有一定的時間間隔。使用clearInterval()取消setInterval()操作。

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

在你的情況,你可以得到對象鍵爲使用Object.keys()一個數組,那裏面setInterval()您可以使用索引得到它。

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);

+0

'int'是一個保留關鍵字.... –

+0

我發現了一個更好的方式來使用Object.keys –

+0

來檢查它。 –

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/

了對象屬性
+0

不幸的是,我不得不使用for循環,因爲我正在使用for(var product in cart) –

+0

好的,讓我編輯我的答案然後... –

+0

@StevenHsu更新它儘可能短。它會每3秒鐘將產品中的每個屬性吐出。 –

1

for循環的執行速度與possi一樣快因此,您的超時時間將在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); 
 
    }
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

這就是我最初做的事情,但是當這樣做的時候,計時器不會啓動,直到我關閉第一個提醒框時,我希望計時器在第一個提醒框出現時立即啓動 –

+0

這是因爲window.alert ()'停止執行javascript。使用警報以外的東西(即模態窗口)來避免它。 – Kaiido

相關問題