2016-08-18 265 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