Javascript:逐个运行回调列表

时间:2015-10-09 07:34:41

标签: javascript jquery google-analytics

实际代码:

鉴于数据

var triggers = {
    'send.ga' : { /* data */ },
    'reload.wnd' : {/* data */}
};

// [...] this = jQuery(document)

for( var _call in triggers ){
    if( data.hasOwnProperty( _call ) ){
        this.trigger( _call , data[ _call ] );
    }
}
  

弹出窗口使用此数据向父/主窗口发送消息。我在使用Google+ / Facebook(OAuth)登录时使用此方法

所以我发送&在document

上触发2个事件
  1. 检查并调用Google Analytics以获取事件记录
  2. 执行页面刷新window.location.reload()
  3. 问题是这两个运行(几乎)同时运行,有时对GA的调用不会在页面重新加载时执行。

    我的目标是以某种方式管理以观察第一个事件何时完成,以便我可以运行第二个事件,依此类推。如果我在calbacks中使用$.ajax怎么办?另一个函数如何调用?

    到目前为止,我尝试了$ .triggerHadler但没有成功。

    你有什么建议?

1 个答案:

答案 0 :(得分:0)

解决方案是使用$.Deffered() Object

这是一个简化的代码,可以作为谁需要它的开始:

(function($){

    // ... push the events to trigger into an array
    var events = [
        {
            'n': 'send.ga', // trigger name
            'd': { /* trigger data */ },
            's': $( document ) // trigger element/scope
        } /* ... more... */
    ];

    // define the function to run for each event
    function runEvent( index ){
        // start with the first element
        if( !index ) index = 0;
        // get current event
        var event = events[ index ];
        $.Deferred()
            // run next event when done
                .done( function(){
                    // check for the next event & call for it
                    ( index + 1 < events.length ) && runEvent( index + 1 )
                } )
            // run current event
                .resolve( event[ 's' ].trigger( event[ 'n' ], event[ 'd' ] ) );
    }

    // run the events queue
    runEvent();

})(jQuery);

无论如何,我不得不修改原始回调触发器函数,因为使用第三方库(或修改某些代码时不可靠)使用ajax或其他一些异步调用时,它们无法“观察”完成。所以我不得不使用这些库的回调选项来管理事件执行队列。