检查javascript中由无关事件触发的函数中的函数是否完整

检查javascript中由无关事件触发的函数中的函数是否完整,javascript,Javascript,我有一个叫做调用facebook的函数 call_facebook(284328420994"); call_facebook(197214710347172); 它多次运行,向facebook发出ajax请求,通常需要几秒钟才能完成 当我在谷歌地图上单击一个标记时,我还有一个修改html的功能: google.maps.event.addListener(loc, 'click', function () { var template = $('#trips').html();

我有一个叫做调用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 );
});

如果单击其中一个标记,则完成呼叫事件。我想重新运行在单击标记时触发的函数。实现这一点的最佳方法是什么?

您可以使用一个回调函数,通过ajax成功回调函数检查您的
调用。如果上面没有列出回调,则什么也不做;如果有,运行它。将其与一个标志结合起来,告诉您是否有未完成的
呼叫\u facebook
呼叫,您可以通过
点击
处理程序检查。大概是这样的:

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 workers(我们不在上面),否则浏览器上的JavaScript是单线程的。因此,我们不会(例如)检查
click
处理程序中的
activecalls===0
,然后在
click
处理程序中的下一条语句执行之前对其进行更改。

这很有效(除了拼写错误和变量名称错误),我本来打算在每次完成一次呼叫时更新内容,但我会让它工作的!