Javascript jQuery/backbone.js-延迟函数调用

Javascript jQuery/backbone.js-延迟函数调用,javascript,jquery,backbone.js,dom-events,settimeout,Javascript,Jquery,Backbone.js,Dom Events,Settimeout,我有一个#search元素,当keyup事件发生时,它应该触发一个函数。仅当keyup在设定的时间内(例如500毫秒)未发生时,此函数才应启动。这将阻止搜索结果更新每个按下的字母。问题在于,对于backbone.js,我将事件放在散列中,适用的事件如下所示: 'keyup#search':'setSearch' 当发生keyup事件时,调用setSearch()函数。我现在还不太清楚该怎么处理。我尝试了各种方法,但是没有任何方法可以保持计时器超过函数结束时间 我有这样的想法: setSearch

我有一个
#search
元素,当
keyup
事件发生时,它应该触发一个函数。仅当
keyup
在设定的时间内(例如500毫秒)未发生时,此函数才应启动。这将阻止搜索结果更新每个按下的字母。问题在于,对于backbone.js,我将事件放在散列中,适用的事件如下所示:

'keyup#search':'setSearch'

当发生
keyup
事件时,调用
setSearch()
函数。我现在还不太清楚该怎么处理。我尝试了各种方法,但是没有任何方法可以保持计时器超过函数结束时间

我有这样的想法:

setSearch: function(event) {
            var timer = window.setTimeout( function() {
                // run function here
                alert('fired');
            }, 500);
    },

我将运行自己的函数,而不是
警报('fired')
。我可以理解为什么此代码不起作用(为发生的每个
keyup
事件设置了计时器。但我仍然不清楚我还可以尝试什么。

在视图中需要一个实例变量来存储计时器ID,然后可以根据需要停止并重新启动它:

setSearch: function(event) {
    var self = this;
    if(self.timer)
        clearTimeout(self.timer);
    self.timer = setTimeout(function() {
        alert('fired');
        self.timer = null;
    }, 500);
}

因此,如果计时器已经在运行,您可以调用以停止它,启动一个新的计时器,并将计时器ID存储在
self.timer
(也称为
this.timer
)。您还需要在计时器的回调函数中重置存储的计时器ID,否则您的
setSearch
在其计时器触发一次后将不会执行任何操作。而所有
self
业务只需捕获
,以便在计时器的回调函数中使用。

因为您希望事件处理程序事件能够维护无论事件是否最近触发了
,您都可能希望将处理程序包装成一个闭包并保持该状态。当事件触发时,该状态应更改为true,并在500毫秒延迟后重置为false

setSearch: function( ) {
    var firedRecently = false;
    return function(event) {
        if (firedRecently) {
            // it has fired recently. Do you want to do something here?
        } else {
            // not fired recently
            firedRecently = true;
            // run your function here
            alert('fired');
            var resetStatus = window.setTimeout( function () {
                firedRecently = false;
            }, 500);
        }
    }
}( );

您所寻找的实际上是从underline.js(主干网的一个需求)提供给您的一个函数

简而言之,这将返回一种新形式的匿名函数,该函数只能每500毫秒调用一次。您可能需要根据需要调整时间

更多信息:
防止每次
键控更新搜索结果
正是下划线的
\uuBounce(函数,等待)
函数要处理的那种情况。状态:


创建并返回传递的
函数的新取消公告版本
,该版本将推迟其执行,直到自上次调用该函数以来已过
等待
毫秒。用于实现仅应在输入停止到达后发生的行为

重构后的代码看起来很简单,如下所示:

setSearch: function(event) {
    _.debounce(doSomething, 300);
},

user1243645的评论:“我在我的项目中遇到了类似的需求。我只是想补充一点,作为对Skylar Anderson关于
\.throttle
的帖子的回应,我发现它更适合我的需要。”对于这个问题,Debounce比throttle好得多。“它将推迟其执行,直到自上次调用它以来已过等待毫秒“-在“搜索字段”的情况下不起作用,因为您不希望它在第一个关键点上进行搜索,您希望在执行搜索之前等待3个关键点等-尤其是对于大型集合。但是如果发生火灾,请等待再次火灾,是的,这很好。”。
setSearch: function(event) {
    _.debounce(doSomething, 300);
},