我最近一直在用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(),但它只是一个例子 - 我确实有我不想使用循环的实例。
这是我的第一篇文章,所以如果我做了与公认的做法不同的事情,我会提前道歉。如果有任何我可以做的事情来改善我的职位,请告诉我 - 我总是接受建设性的批评:)
谢谢!
答案 0 :(得分:5)
你会想要使用延迟。我刚才在jsfiddle上写了一个例子,可能会给你一些见解。
http://jsfiddle.net/landau/M3Lj4/
从你的代码中看,你似乎误解了一般的延迟,或者这里没有足够的代码来告诉你在做什么。承诺隐藏resolving
和rejecting
功能
基本上,
var deferred = $.Deferred();
var promise = deferred.promise();
// This will only run once
var timer = setInterval( function () {
deferred.resolve();
}, 1000);
promise.done(function () {
clearInterval( timer );
});