使用jQuery .promise()来调用clearInterval()

时间:2012-07-06 13:28:25

标签: javascript jquery setinterval clearinterval promise

我最近一直在用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);
   }
}

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

这是我的第一篇文章,所以如果我做了与公认的做法不同的事情,我会提前道歉。如果有任何我可以做的事情来改善我的职位,请告诉我 - 我总是接受建设性的批评:)

谢谢!

1 个答案:

答案 0 :(得分: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 );
});