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
実行される前にハンドラーを変更することはありません。