【问题标题】:using jQuery .promise() to call clearInterval()使用 jQuery .promise() 调用 clearInterval()
【发布时间】:2012-07-06 21:44:23
【问题描述】:

我最近对 ​​setInterval 和 clearInterval 进行了很多试验,以创建我自己的自定义效果,而我一直在做的事情之一是在保持全局范围之外清除间隔的有效方法。我正在尝试通过使用 .promise() 调用 clearInterval() 来提高可读性并探索可能的性能提升(以下是我正在尝试做的示例):

//caller is a collection of elements
function performEffect(caller) {
   var interval = setInterval(function() { caller.next(); }, 500);
   caller.promise().done(function() { interval = clearInterval(interval); });
}

直到最近,我一直在使用嵌入式函数设置和清除间隔(示例):

function performEffect(caller) {
   var interval;
   var count = 0;
   var len = caller.length;

   if (count >= len) {
       interval = clearInterval(interval);
   }

   var tmr = function () {
       interval = setInterval(function () { effectFunciton(count++); }, 100);
   }
}

附:很抱歉没有发布原版 - 我的版本控制系统已损坏。另外,我知道这个例子有点傻,因为我可以很容易地使用 for 循环或 .each(),但这只是一个例子 - 我确实有一些我不想使用循环的实例。

这是我的第一篇文章,所以如果我做了一些与公认做法不同的事情,我提前道歉。请让我知道我将来是否可以做些什么来改进我的帖子 - 我总是乐于接受建设性的批评:)

谢谢!

【问题讨论】:

    标签: javascript jquery setinterval clearinterval promise


    【解决方案1】:

    您需要为此使用延迟。不久前我在 jsfiddle 上写了一个示例,可能会给您一些见解。

    http://jsfiddle.net/landau/M3Lj4/

    从您的代码来看,您似乎误解了一般的延迟,或者这里没有足够的代码来说明您在做什么。 Promise 隐藏了 resolvingrejecting 功能

    基本上,

    var deferred = $.Deferred();
    var promise = deferred.promise();
    
    // This will only run once
    var timer = setInterval( function () {
        deferred.resolve();
    }, 1000);
    
    promise.done(function () {
        clearInterval( timer );
    });
    

    【讨论】:

    • 太棒了!这正是我一直在寻找的。我想我可能对 deferreds 有点误解,所以在继续之前我会检查更多关于这些的内容。非常感谢。
    • 很好,如果这是您问题的答案,请点击复选框。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2013-10-04
    • 2014-03-03
    • 2011-07-14
    • 1970-01-01
    • 2012-11-03
    • 2023-04-02
    相关资源
    最近更新 更多