2012-12-18 42 views
0

_.throttle(function() {}, 250)功能是否仅在click上触发?因为我试图用一些延迟来运行一些代码,并且由于某种原因它似乎不工作。下划线的油门功能不会触发

return _.throttle(function() { 
    return ($(this).hasClass('dataRevealed')) ? $(this).addClass('animated fadeOut') : true; 
}, 350); 

编辑:功能如下:

Application.CardView.prototype.removeSimilarCards = function(_container) { 
    return $(_container).find('[data-identifier="card-view"]').each(function() { 
     console.log("first"); 
     _.throttle(function() { 
      console.log("inner"); 
      return ($(this).hasClass('dataRevealed')) ? $(this).addClass('animated fadeOut') : true; 
     }, 350); 
    }); 
}; 
+0

为什么不使用window.setTimeout()出于同样的目的? – Raul

+0

你怎么称呼那个功能?你期望得到延迟执行的结果吗? – Bergi

+0

这个函数从(或者)到return的返回值在哪里? –

回答

1

_.throttle用于防止功能运行的次数太多的“节流”它所以它每X毫秒只运行一次。您可能想要使用函数队列,在延迟的计时器上出队。

事情是这样的:

Application.CardView.prototype.removeSimilarCards = function(_container) { 
    var $ele = $(_container), 
     $cards = $ele.find('[data-identifier="card-view"]'); 

    $cards.each(function() { 
     var $this = $(this); 
     $ele.queue('func', function(next){ 
      if($this.hasClass('dataRevealed')){ 
       $this.addClass('animated fadeOut'); 
      } 
      setTimeout(next, 350); 
     }); 
    }); 

    setTimeout(function(){ 
     $ele.dequeue('func'); 
    }, 350); 

    return $cards; 
}; 
+0

直到现在还没有使用'.queue()':)尽管如此,是否有办法一次又一次地将它们逐一淡出呢?我这样做的原因是因为有一个动画需要大约350毫秒,只有在这之后我才会淡出div并将它们从DOM中删除,所以也许我应该听取转场结束? – Roland

+0

不要认为动画会在特定时间内完成。你如何做动画?它可能有一个回调选项,用它来代替。 –

+0

这是CSS动画,翻转动画 – Roland

0

可能在你的代码中的一些其他问题。

我创建了一个样本,以表明它正在完美see example

下面是代码:

var refTime = +new Date(); 
var fn = _.throttle(function() { 
    console.log((+new Date() - refTime)/1000); 
}, 3000); 

window.setInterval(fn, 10); 
+0

我不知道会发生什么问题,因为我也在其他地方使用'_.debounce',它的工作原理很好 – Roland

+0

对$(this)不起作用有疑问,但那也行得通。检查:http://jsbin.com/asaxod/8/watch – closure

+0

可能会交换代码在您的油门到别的东西来调试。 – closure

3

如前所述的正式文件underscore#throttle,在功能上的传递必须是一个节流版本。你看,“限制”必须在它被传入之前被执行。我刚刚得到了这个工作。 :) @closure在上面的评论中提到了这一点。我们应该更多地阅读官方文件。

var throttled = _.throttle(updatePosition, 100); 
$(window).scroll(throttled);