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 に答える