0

我尝试为我正在处理的项目的异步调用中的排序问题创建一个简单的解决方案。

我找到的最佳解决方案是:我附加一个事件来检查是否完成了先决条件,如果是,我删除事件侦听器并执行该功能。

每个函数一旦完成就会调用事件,这样每个人都将等待直到可以运行。

这是代码:

$(function() {
    $(document).on('bmadone',function() {
        if(beepmeapp.done_arr['fb-init']){
            $(document).off('bmadone','#bma-root',this);
            getBMAUserRoutes();
        }
    });
});

该功能(用于测试)正在执行此操作:

function getBMAUserRoutes(){
    $.ajax({
        url     : '/bma/users/fb',
        type    : 'GET',
        data    : {
            access_token: 'abc'
        },
        success : function( data ) {
            console.log('getBMAUser: success');
            beepmeapp.done_arr['user-init'] = true;
            $('#bma-root').trigger('bmadone');
        },
        error   : function( xhr, err ) {
            console.log('getBMAUser: error');
        }
    });    
}

它很好用,但我遇到的问题是它进入了一个永无止境的循环。不知道为什么,但它看起来像:

$(document).off('bmadone','#bma-root',this);

不会删除侦听器...

我是 JS / Jquery 和所有这些客户端开发的真正新手,所以我想我可能缺少一些基本的东西。

4

1 回答 1

0

您必须将相同的(子)参数集.off传递给传递给.on. 即在你的情况下它会是$(document).off('bmadone')

您从未传递'#bma-root'.on并且this没有引用事件处理程序(您传递给的函数.on,因此通过传递那些您不会删除正确的事件处理程序。


如果您只需要删除该特定处理程序,则可以使用命名函数:

function handler() {
    if(beepmeapp.done_arr['fb-init']){
        $(document).off('bmadone', handler);
        getBMAUserRoutes();
    }
}

$(document).on('bmadone', handler);

// or as a named function expression

$(document).on('bmadone', function handler() {
    if(beepmeapp.done_arr['fb-init']){
        $(document).off('bmadone', handler);
        getBMAUserRoutes();
    }
});

或使用命名空间事件

于 2013-01-16T09:26:36.013 回答