实际代码:
鉴于数据
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
window.location.reload()
问题是这两个运行(几乎)同时运行,有时对GA的调用不会在页面重新加载时执行。
我的目标是以某种方式管理以观察第一个事件何时完成,以便我可以运行第二个事件,依此类推。如果我在calbacks中使用$.ajax
怎么办?另一个函数如何调用?
到目前为止,我尝试了$ .triggerHadler但没有成功。
你有什么建议?
答案 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或其他一些异步调用时,它们无法“观察”完成。所以我不得不使用这些库的回调选项来管理事件执行队列。