【问题标题】:How to do an infinite loop with jquery queue如何用jquery队列做一个无限循环
【发布时间】:2019-09-13 11:47:22
【问题描述】:

页面加载后,我的代码翻转了 6 个图块。 这很好用。

var flipTiles = function() {
    $('.flip-tile').each(function( i, el ) {
        var elDelay = $(el).data('delay');
        $(el).delay(elDelay).queue(function() {
            $(this).flip(true);
            $(this).dequeue();
        });
    });
};

flipTiles();

我的问题是我怎样才能做到这一点,让瓷砖不断翻转。就像那里的页面加载和瓷砖有自己的延迟翻转一样。在所有瓷砖翻转后,我想重新开始序列并将它们翻转回来等。

任何帮助表示赞赏! 在此先感谢:)

【问题讨论】:

    标签: javascript jquery queue


    【解决方案1】:

    您需要解开循环并让每个步骤按顺序触发下一个步骤,请参阅 cmets:

    var flipTiles = function() {
        // Grab the tiles
        var tiles = $('.flip-tile');
        // Start with the first tile
        var i = 0;
        // Do that tile
        next();
        function next() {
            var tile = tiles.eq(i);
            tile.delay(tile.data('delay')).queue(function() {
                tile.flip(true);
                tile.dequeue();
                // Increment `i`, wrap-around at the end
                i = (i + 1) % tiles.length;
                // Do the next tile
                next();
            });
        }
    };
    
    flipTiles();
    

    如果您想取消它,请返回调用者可以用来执行此操作的内容:

    var flipTiles = function() {
        var running = true;
        // Grab the tiles
        var tiles = $('.flip-tile');
        // Start with the first tile
        var i = 0;
        // Do that tile
        next();
        // Return something the caller can use to cancel
        return function() {
            running = false;
        };
        function next() {
            if (!running) {
                return;
            }
            var tile = tiles.eq(i);
            tile.delay(tile.data('delay')).queue(function() {
                tile.flip(true);
                tile.dequeue();
                // Increment `i`, wrap-around at the end
                i = (i + 1) % tiles.length;
                // Do the next tile
                next();
            });
        }
    };
    
    var cancel = flipTiles();
    // (later)
    cancel();
    

    【讨论】:

    • 这行不通,因为你将进入函数next 并且永远不会离开它。
    • @DaniloKörber- 不,你不会。尝试一下! next 几乎立即返回,安排了一些异步回调,然后flipTiles 几乎立即返回。随着浏览器的计时器机制调用异步回调,磁贴会不断翻转。
    • @t-j-crowder - 我试过了,代码永远不会离开函数next...jsfiddle.net/dkorber/52uabqn9/6
    • @DaniloKörber - 该小提琴中的代码缺少我在上面的评论中提到的关键方面:调度异步回调。您刚刚完全丢弃了相关位。我建议您查看delayqueue
    【解决方案2】:

    要“永远循环”,您可以使用setTimeout 事件:

    myVar = setTimeout(function() { flipTiles(); }, 3000); // 3000 is the value in milliseconds to repeat the command
    

    停止“循环”使用

    clearTimeout(myVar);
    

    【讨论】:

    • 这不起作用有两个原因。首先是因为您将flipTiles() 函数的响应 提供给setTimeout(),而不是函数reference。其次,因为你告诉它每 3 秒翻转 6 张牌,而不是在特定间隔内无限翻转它们
    • 谢谢,@rory-mcgrossan。我更正了调用该函数的代码。三秒只是一个例子,他必须根据自己的需要进行调整。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2012-11-06
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多