使用Underscore去抖重写setInterval函数

时间:2012-10-23 20:24:47

标签: javascript jquery underscore.js

我正在重写我的setInterval任务,以便当我使用Underscore.js去抖动跳转到我网站上的其他标签时,我不再需要clearInterval。

我不断收到错误_.debounce is not a function

这是我原来的工作代码。基本上,当标签是'全景'时,我运行这个功能,每50ms改变一次摄像机角度。当我在'pano'选项卡上单击时,clearInterval将重置计时器。

clearInterval(timerID);
if (target == 'pano') {
   initialize();
   timerID = setInterval(function(){
     if (!hovering && !moved) {
       panoOptions.pov.heading += .5;      
       panoOptions.pov.heading = wrapAngle(panoOptions.pov.heading);
       panorama.setOptions(panoOptions);
     }
   },50);

  initialize();

} 

当我尝试重构我的代码以使用._debounce(http://underscorejs.org/#debounce)时,我收到错误,如果我的方法是正确的,我就不会。

timerID = _.debounce(function(){
  if (!hovering && !moved) {
    panoOptions.pov.heading += .5;      
    panoOptions.pov.heading = wrapAngle(panoOptions.pov.heading);
    panorama.setOptions(panoOptions);
  }
},50);

$("#pano_toggle").click(
  function(){
    console.log("CLICKED");
    timerID();
  }
);

我基本上设置了一个点击监听器,这样当用户点击按钮时,debounce功能就会开始运行。我还添加了console.log("CLICKED")以查看我的点击监听器是否正常工作,但它没有取消点击。

关于我的逻辑失败的任何提示?

编辑:

我确保要求Underscore.js:

require(["require", 
         "jquery", 
         "underscore",
         "lib/jquery/jquery.galleria",
         "gmaps!",
         "//assets.pinterest.com/js/pinit.js",
         "twitter_bootstrap/bootstrap-dropdown"], function(require, _){

1 个答案:

答案 0 :(得分:3)

您的require语法不正确。模块按照它们在第一个数组中列出的顺序作为参数传递给您的函数。所以看起来应该是这样的:

require([
     "require", 
     "jquery", 
     "underscore",
     "lib/jquery/jquery.galleria",
     "gmaps!",
     "//assets.pinterest.com/js/pinit.js",
     "twitter_bootstrap/bootstrap-dropdown"
], function(require, $, _, galleria, ...){
     /* .... */
});

虽然,您不需要 require 本身。