检查由 javascript 中不相关事件触发的函数中的函数是否完成

Check if function is complete in function that is triggered by unrelated event in javascript

本文关键字:函数 是否 javascript 不相关 事件 检查      更新时间:2023-09-26

我有一个名为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事件。我想重新运行单击标记时触发的函数。最好的方法是什么?

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