Jquery .each()和SetTimeout随机的时间量

时间:2017-06-22 02:55:52

标签: javascript jquery

长话短说明我知道为什么setTimeout在.each函数中不起作用,但是我试图开始工作的情况有点复杂。

这次我有两个循环,一个内部和外部。必须按照这个确切的顺序执行操作,否则结果将不正确,这意味着每个SetTimeout()必须停止其他所有操作。此外,每个功能的超时时间必须是随机的。

// First Loop
$('.items').each(function(e) {
// Something to do
setTimeout(function() {
    // Code that does it

    // Something else to do
    setTimeout(function() {
        // Code that does it

        // Second Loop
        $('.inner-items').each(function(e) {
            // Something to do
            setTimeout(function() {
                // Code that does it

                // Something else to do
                setTimeout(function() {
                    // Code that does it

                    // Why not a third
                    setTimeout(function() {
                        // Code that does it
                    }, Math.random());
                }, Math.random());
            }, Math.random());
        });
    }, Math.random());
}, Math.random());
});

1 个答案:

答案 0 :(得分:0)

这可能有用。还没有测试,但想法是从等待时间0开始,然后每次你想要“停止”这个功能你真的只是在等待时间添加一个新的随机数,所以每个setTimeout都在等待所有在它之前添加的时间以及新增的随机时间。

另外,重要的是,在第二个循环中,循环遍历当前迭代的项目的子项而不是所有.inner项目。我添加$(this).find('.inner-items')来执行此操作。

var waitTime = 0;

// First Loop
$('.items').each(function(e) {

    // add to wait time
    waitTime += Math.random();

    // Something to do
    setTimeout(function() {
        // Code that does it
    }, waitTime);

    // add to wait time
    waitTime += Math.random();

    // Something else to do
    setTimeout(function() {
        // Code that does it
    }, waitTime);

    // Second Loop
    $(this).find('.inner-items').each(function(e) {

        // add to wait time
        waitTime += Math.random();

        // Something to do
        setTimeout(function() {
            // Code that does it
        }, waitTime);

        // add to wait time
        waitTime += Math.random();

        // Something else to do
        setTimeout(function() {
            // Code that does it
        }, waitTime);

        // add to wait time
        waitTime += Math.random();

        // Why not a third
        setTimeout(function() {
            // Code that does it
        }, waitTime);
    });
});

修改

刚刚测试过,似乎有效。每次添加时,我添加了至少500和2000,以便更好地可视化按顺序和随机时间触发的事件。

此外,我不确定你的意思“setTimeout在.each函数中不起作用”。但是通过使用自执行函数,我可以迭代当前项并在setTimeout中使用。

https://codepen.io/RyanGoree/pen/yXXbNM