0

フェイスブックを呼び出すという機能があります。

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 );
});

マーカーの1つをクリックしてから、call_facebook-eventが完了すると。マーカーをクリックするとトリガーされる関数を再実行したい。これを行うための最良の方法は何ですか?

4

1 に答える 1

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 );
    }
});

上記に対して行うことができるさまざまな改善があります。たとえば、同じものに関連する2つのものだけをフックする必要がある場合locは、配列ではなくコールバックのマップを使用して、関連するものだけを起動できます。clickハンドラー内のロジックを、 call_facebook(メンテナンス用の)などと一緒に別の関数に分離することができf();ます。呼び出しの周りにエラーをトラップする可能性があります。しかし、それが基本的な考え方です。

上記の競合状態は、あるかのように見えますが、ないことに注意してください。イベントは非同期であり、JavaScriptコードの実行中を含め、いつでもキューに入れることができます。ただし、Webワーカー(上記ではありません)を使用しない限り、ブラウザーのJavaScriptはシングルスレッドであるため、ハンドラーが同時に実行されることはありません。したがって、(たとえば)ハンドラーをチェックインactivecalls === 0してから、clickハンドラー内の次のステートメントがclick実行される前にハンドラーを変更することはありません。

于 2012-06-17T12:30:56.843 に答える