2015-11-13 152 views
2

我在JQuery中使用事件在不同的JavaScript模块之间进行通信。因此,在一个模块中我有这样的事情:在完成之前JQuery - 防止触发多个事件

$(window).on('updateStatusRequest', function(ev) { 
    // Send updateStatus event after fetching data 
    data = fetchData(); 
    $(window).trigger('updateStatus', data); 
}); 

而这个数据提取有可能持续很长时间(发送以外的HTTP请求)。这是我正在考虑的一个问题 - 如果触发了很多'updateStatusRequest'并且该函数没有获取数据呢?我想,以防止在这种情况下,所以我想的是这样的多个数据获取:

$(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); 
}); 

所以我想在执行过程中把回调关闭。不幸的是,上述方法不起作用。什么是正确的方法来做到这一点?

+0

嗯......“'fetchData'花费很长的时间” ......我们继续在这之前,可以请你,你是不是用同步请求,向我保证? – Katana314

+0

我正在使用JQuery的'getJSON()'来获取数据,我没有发现它的文档中是否是异步的,但我假设它是因为它与外部联系。 – qiubit

+0

对于Howard的回答,您可以将函数的内容封装在if语句中,该语句检查全局变量,如果(!fetching){fetching = true; ...}并在fetchData完成时将读取设置为false。 – DrunkWolf

回答

2

当你添加事件处理回你需要一个回调像这样的东西应该工作:

$(window).on('updateStatusRequest', function(ev) { 
    newFunction(); 
}); 

var newFunction = function(){ 
    $(window).off('updateStatusRequest'); 
    data = fetchData(); 
    $(window).trigger('updateStatus', data); 
    $(window).on('updateStatusRequest', function(){ 
     newFunction(); 
    }); 
} 

虽然,我可能会使用一个承诺,而不是添加/删除的事件处理程序的...

+0

感谢您的承诺参考,可能会使用它,因为它更清晰 – qiubit

+0

没有问题 - 承诺是伟大的,我一直在使用它们。 –