Javascript JQuery-防止触发多个事件

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

我使用JQuery中的事件在不同的JavaScript模块之间进行通信。在其中一个模块中,我有如下内容:

$(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而不是添加/删除事件处理程序…

使用并关闭async

Hm…“
获取数据
需要很长时间”…在我们继续之前,您能保证您没有使用同步请求吗?我使用JQuery的
getJSON()
来获取数据,我没有在它的文档中找到是否是异步的,但我假设它是异步的,因为它与外部接触。或者,除了Howard的回答,您可以将函数的内容包装在一个if语句中,该语句检查全局变量if(!fetching){fetching=true;…}在fetchData完成时再次将fetching设置为false。感谢promise引用,我可能会使用它,因为它更清晰。没问题-promises很棒,我一直都在使用它们。