3

我最近对 ​​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);
   }
}

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

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

谢谢!

4

1 回答 1

5

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

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

从您的代码来看,您似乎误解了一般的延迟,或者这里没有足够的代码来说明您在做什么。承诺隐藏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 );
});
于 2012-07-06T13:44:23.057 回答