所有动画完成后,clearInterval()和setInterval()

时间:2014-08-02 16:22:47

标签: javascript jquery

我有一个通过setInterval重复调用的函数来创建动画。如果仍有动画正在运行,我需要它停止调用该函数,直到所有动画完成。我使用的代码如下:

编辑:添加编码,我从DOM中删除动画元素,这是问题吗?

var serviceLoop = setInterval(serviceQueue, LOOP_POLL_MS); //10 ms

function serviceQueue()
{
       //do some animations..
       function moveMan(from, to, plane)
      {
        (function() {

            var tmp_from = from;
            var tmp_to = to;
            var tmp_plane = plane;
            var pos = tmp_from.offset();
            var temp = tmp_from.clone(true);

            temp.css({ "visibility":"visible",
                "position":"absolute",
                "top":pos.top + "px",
                "left":pos.left + "px"});
           temp.appendTo("body");
           tmp_from.css("visibility", "hidden");
        //if (!tmp_plane) tmp_to.css("visibility", "hidden");
           temp.animate(to.offset(), moveMan.ANIMATION_TIME, function() {
                tmp_to.css("visibility", "visible");
                temp.remove();
           });
       })();
     }
       if ($(":animated").length > 0)
        {
            clearInterval(serviceLoop);
            $(":animated").promise().done(function() {
                serviceLoop = setInterval(serviceQueue, LOOP_POLL_MS);
            });
        }
}

我遇到的问题是在几个动画之后,传递给done()的函数永远不会被调用,并且脚本会停止。

1 个答案:

答案 0 :(得分:1)

你似乎最终等待等待某些动画的promise(),但是你从DOM中移除了一些这些对象,然后他们的动画永远不会完成,所以承诺永远不会解决。

请参阅.promise()的jQuery文档中的这句话:

  

注意:返回的Promise链接到存储在其上的Deferred对象   元素的.data()。由于.remove()方法删除了   元素的数据以及元素本身,它将阻止任何   元素解决的未解决的承诺。如果有必要的话   要在解析Promise之前从DOM中删除元素,请使用   .detach()代替并在解析后跟随.removeData()。

对于要从DOM中删除的任何项目,一次快速破解可能是最高呼叫.stop(true)

一般情况下,需要重新编写此代码以避免这种可能性,并希望重新考虑如何处理您每10分钟尝试做的事情,因为这通常是一个糟糕的设计。您应该使用事件来触发更改,而不是10毫秒轮询操作。您尚未解释此代码的用途,因此我不清楚建议的替代方法。