苦苦于使用setInterval / setTimeout的准确替换

时间:2013-01-20 13:02:44

标签: javascript settimeout setinterval

我正在尝试使用超大型jquery插件(here)底部的代码(来自here)。这是因为我需要一个更准确的计时器,因为我正在用声音同步图像。

基本上,超大化有这些线:

vars.slideshow_interval = setInterval(base.nextSlide, base.options.slide_interval);

clearInterval(vars.slideshow_interval); 

我需要做类似的事情:

vars.slideshow_interval = accurateInterval(base.nextSlide, base.options.slide_interval);

vars.slideshow_interval.clear();

问题我的javascript技能有些限制,我甚至不知道下面函数的术语/描述,我想它需要以base.accurateInterval = function(time fn)的形式...而不是因为我怀疑问题与在错误的上下文中使用(this)有关。

我试图按原样使用代码,而在调用clear()时,我得到'不是函数错误'。

我怎样才能让它工作呢?任何指针,非常感谢。谢谢。

(function () {
    window.accurateInterval = function (time, fn) {
        var cancel, nextAt, timeout, wrapper, _ref;
        nextAt = new Date().getTime() + time;
        timeout = null;
        if (typeof time === 'function') _ref = [time, fn], fn = _ref[0], time = _ref[1];
        wrapper = function () {
            nextAt += time;
            timeout = setTimeout(wrapper, nextAt - new Date().getTime());
            return fn();
        };

        cancel = function () {
            return clearTimeout(timeout);
        };

        timeout = setTimeout(wrapper, nextAt - new Date().getTime());
        return {
            cancel: cancel
        };
    };
}).call(this);

1 个答案:

答案 0 :(得分:0)

(function () { … }).call(this);包装器是一种coffeescript特性,可确保this等于全局对象,实际上根本不需要它。 window.accurateInterval = …足以使函数成为全局函数。

  

当调用clear()时,我得到'不是函数错误'。

这是因为accurateInterval使用 cancel 方法返回一个对象。使用

vars.slideshow_interval.cancel();