2016-08-18 264 views
0

兩個setInterval循環應如何嵌套?嵌套setInterval循環

在外部循環(setInterval1),我希望每4秒發一個服務器請求,然後在內部joop(setInterval2)中,我希望做1秒鐘的事情。過了一會兒,我的內循環變得瘋狂,如果我試圖清除它,它永遠不會觸發。

https://jsfiddle.net/y1f6nm6z/

var counter1 = 0; 
var counter2 = 0; 
var setInterval1 = setInterval(function() { 
    //$.getJSON('/getData.php', function(json) { 
    console.log('counter1', counter1); 
    counter1++; 
    var setInterval2 = setInterval(function() { 
    console.log('counter2', counter2); 
    counter2++; 
    }, 1000); 
    //clearInterval(setInterval2); 
    //}); 
}, 4000); 
+0

你的意思是使用的setTimeout,而不是setInterval的? setTimeout會等待4秒,然後你可以做一個嵌套的setInterval,它會每秒做一些事情。嵌套setInterval將每4秒啓動第二個setInterval。 – user2263572

+4

_「兩個setInterval循環應如何嵌套?」_ - 如何:「一點都不」? //使用每秒調用一個函數的_one_循環,然後在該函數內部根據計數器決定當前迭代是否是4的倍數...... – CBroe

+0

@ user2263572也許我的意思是(或者想要)setTimeout。讓我研究一下。 – user1032531

回答

1

不要窩setIntervals(除非你清除它們,也許)

這是發生了什麼,當你這樣做的:

setInterval1 
    ├────> function1 ────> setInterval2 
    │       ├────> function2 
    │       ├────────> function2 
    │       ├────────────> function2 
    │       ⋮ 
    ├────────> function1 ────> setInterval2 
    │        ├────> function2 
    │        ├────────> function2 
    │        ├────────────> function2 
    │        ⋮ 
    ├────────────> function1 ────> setInterval2 
    │         ├────> function2 
    │         ├────────> function2 
    │         ├────────────> function2 
    │         ⋮ 
    ├────────────────> … 
    ⋮ 

我建議setTimeout代替:

var counter1 = 0; 
 
var counter2 = 0; 
 
(function timeout1() { 
 
    console.log('counter1', counter1); 
 
    counter1++; 
 
    var i = 0; 
 
    (function timeout2() { 
 
    console.log('counter2', counter2); 
 
    counter2++; 
 
    ++i; 
 
    setTimeout(i < 4 ? timeout2 : timeout1, 1000); 
 
    })(); 
 
})();

即使您將它們嵌套在一起,它們通常也不會比setInterval更成問題。但是請使用一些有條件的方式,以確保在必要時只撥打setTimeout

var counter1 = 0; 
 
var counter2 = 0; 
 
(function timeout1() { 
 
    console.log('counter1', counter1); 
 
    counter1++; 
 
    var i = 0; 
 
    (function timeout2() { 
 
    console.log('counter2', counter2); 
 
    counter2++; 
 
    ++i; 
 
    if(i < 4) setTimeout(timeout2, 1000); 
 
    })(); 
 
    setTimeout(timeout1, 4000); 
 
})();

+0

謝謝Oriol,是的,我目睹了指數增長!有關使用嵌套超時與使用邏輯確定週期的單個超時循環的任何想法? – user1032531

+0

@ user1032531您可以將它們嵌套在一起,但要確保內部函數每次外部調用只調用4次。 – Oriol

0

你正在創建一個新的時間間隔每4秒。不要嵌套setInterval。也許你真正想要的是setTimeout