Javascript JQuery-防止触发多个事件
我使用JQuery中的事件在不同的JavaScript模块之间进行通信。在其中一个模块中,我有如下内容:Javascript JQuery-防止触发多个事件,javascript,jquery,Javascript,Jquery,我使用JQuery中的事件在不同的JavaScript模块之间进行通信。在其中一个模块中,我有如下内容: $(window).on('updateStatusRequest', function(ev) { // Send updateStatus event after fetching data data = fetchData(); $(window).trigger('updateStatus', data); }); $(window).on('updateS
$(window).on('updateStatusRequest', function(ev) {
// Send updateStatus event after fetching data
data = fetchData();
$(window).trigger('updateStatus', data);
});
$(window).on('updateStatusRequest', function(ev) {
$(window).off('updateStatusRequest', this);
// Send updateStatus event after fetching data
data = fetchData();
$(window).trigger('updateStatus', data);
$(window).on('updateStatusRequest', this);
});
在完成之前,这个数据提取可能会持续很长时间(它向外部发送HTTP请求)。我现在想的是一个问题——如果触发了很多“updateStatusRequest”,而函数还没有获取数据,该怎么办?在这种情况下,我想防止多次数据提取,因此我考虑如下:
$(window).on('updateStatusRequest', function(ev) {
// Send updateStatus event after fetching data
data = fetchData();
$(window).trigger('updateStatus', data);
});
$(window).on('updateStatusRequest', function(ev) {
$(window).off('updateStatusRequest', this);
// Send updateStatus event after fetching data
data = fetchData();
$(window).trigger('updateStatus', data);
$(window).on('updateStatusRequest', this);
});
所以我想在回调执行期间关闭它。不幸的是,上述方法不起作用。正确的方法是什么?在重新添加事件处理程序时,需要回调。像这样的方法应该会奏效:
$(window).on('updateStatusRequest', function(ev) {
newFunction();
});
var newFunction = function (){
$(window).off('updateStatusRequest');
data = fetchData();
$(window).trigger('updateStatus', data);
$(window).on('updateStatusRequest', function (){
newFunction();
});
}
虽然,我可能会使用promise而不是添加/删除事件处理程序…使用并关闭asyncHm…“
获取数据
需要很长时间”…在我们继续之前,您能保证您没有使用同步请求吗?我使用JQuery的getJSON()
来获取数据,我没有在它的文档中找到是否是异步的,但我假设它是异步的,因为它与外部接触。或者,除了Howard的回答,您可以将函数的内容包装在一个if语句中,该语句检查全局变量if(!fetching){fetching=true;…}在fetchData完成时再次将fetching设置为false。感谢promise引用,我可能会使用它,因为它更清晰。没问题-promises很棒,我一直都在使用它们。