我有一个名为call facebook的功能。
call_facebook(284328420994");
call_facebook(197214710347172);
它运行了几次它向facebook发出ajax请求,通常需要几秒钟才能完成。
当我点击谷歌地图上的标记时,我还有另一个修改html的功能:
google.maps.event.addListener(loc, 'click', function () {
var template = $('#trips').html();
var content = locationIndex[loc.title];
var html = Mustache.to_html(template, content );
});
如果单击其中一个标记,则完成call_facebook-event。我想重新运行单击标记时触发的函数。这样做的最佳方式是什么?
答案 0 :(得分:2)
您可以使用call_facebook
函数从ajax成功回调中检查回调。如果上面没有列出回调,则什么也不做;如果有,运行它。将其与一个标记结合,告诉您是否有一个未完成的call_facebook
调用,您可以从click
处理程序中检查它。 像这样的东西:
var done_callbacks = [];
var activecalls = 0;
function call_facebook(id) {
// Set active flag
++activecalls;
// Start ajax
start_ajax_call(/* ... */, function() {
var f;
// This is the "success" callback
// Decrement active flag
--activecalls;
if (activecalls === 0) {
// None others are active, process callbacks
while (done_callbacks.length !== 0) {
f = done_callbacks.shift();
f();
}
}
});
}
然后
google.maps.event.addListener(loc, 'click', function () {
if (activecalls === 0) {
doUpdate();
}
else {
done_callbacks.push(doUpdate);
}
function doUpdate() {
var template = $('#trips').html();
var content = locationIndex[loc.title];
var html = Mustache.to_html(template, content );
}
});
您可以对上述内容进行各种改进。例如,如果你只需要将两个与同一loc
相关的东西挂钩,你可以使用回调映射而不是数组,只激发相关的映射。您可以将click
处理程序中的逻辑与call_facebook
旁边的另一个函数(用于维护)等等隔离开来。您可能会在f();
调用周围捕获错误。但那是基本的想法。
请注意,上面没有竞争条件,即使它看起来好像有。事件是异步的,可以随时排队,包括JavaScript代码运行时;但是他们的处理程序永远不会同时运行,因为除非你使用web worker(我们不在上面),否则浏览器上的JavaScript是单线程的。因此,我们不会(例如)检查activecalls === 0
处理程序中的click
,然后在click
处理程序中的下一个语句执行之前更改它。