From 768a8cb743656c326e741bc1fa10ecb8e74d48fa Mon Sep 17 00:00:00 2001 From: Max Goodman Date: Sun, 3 Feb 2013 23:44:00 -0800 Subject: [PATCH] analytics: Use deferreds to prevent duplicate fetch-trackers requests. --- r2/r2/public/static/js/analytics.js | 57 ++++++++++++++++------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/r2/r2/public/static/js/analytics.js b/r2/r2/public/static/js/analytics.js index f428f5b1e..071165930 100644 --- a/r2/r2/public/static/js/analytics.js +++ b/r2/r2/public/static/js/analytics.js @@ -14,8 +14,8 @@ r.analytics = { $('form.gold-checkout').one('submit', this.fireGoldCheckout) }, - fetchTrackingHashes: function(callback) { - var fullnames = [] + fetchTrackingHashes: function() { + var fullnames = {} /*------------------------------------------* Generates a trackingName like: @@ -35,29 +35,34 @@ r.analytics = { if (!fullname || fullname in r.analytics.trackers) return + var trackingName = fullname + if (sponsorship) - fullname += '_' + sponsorship + trackingName += '_' + sponsorship // append a hyphen even if there's no campaign - fullname += '-' + (campaign || '') + trackingName += '-' + (campaign || '') if (!r.config.is_fake) - fullname += '-' + r.config.post_site + trackingName += '-' + r.config.post_site - thing.data('trackingName', fullname) - fullnames.push(fullname) + thing.data('trackingName', trackingName) + fullnames[fullname] = trackingName }) - $.ajax({ - url: r.config.fetch_trackers_url, - type: 'get', - dataType: 'jsonp', - data: { 'ids': fullnames }, - success: function(data) { - $.extend(r.analytics.trackers, data) - callback() - } - }) + var xhr = $.ajax({ + url: r.config.fetch_trackers_url, + type: 'get', + dataType: 'jsonp', + data: { 'ids': _.values(fullnames) }, + success: function(data) { + $.extend(r.analytics.trackers, data) + } + }) + + _.each(fullnames, function(trackingName, fullname) { + this.trackers[fullname] = xhr + }, this) }, fetchTrackersOrFirePixel: function(e) { @@ -67,23 +72,25 @@ r.analytics = { if (!fullname) return - if (fullname in this.trackers) { - this.fireTrackingPixel(target) - } else { - this.fetchTrackingHashes($.proxy(this, 'fireTrackingPixel', target)) + if (!(fullname in this.trackers)) { + this.fetchTrackingHashes() } + + $.when(this.trackers[fullname]).done(_.bind(function() { + this.fireTrackingPixel(target) + }, this)) }, fireTrackingPixel: function(thing) { if (thing.data('trackerFired')) return - var fullname = thing.data('trackingName'), - hash = this.trackers[fullname] + var trackingName = thing.data('trackingName'), + hash = this.trackers[trackingName] var pixel = new Image() pixel.src = r.config.adtracker_url + '?' + $.param({ - 'id': fullname, + 'id': trackingName, 'hash': hash, 'r': Math.round(Math.random() * 2147483647) // cachebuster }) @@ -96,7 +103,7 @@ r.analytics = { old_html = link.html(), dest = link.attr('href'), click_url = r.config.clicktracker_url + '?' + $.param({ - 'id': fullname, + 'id': trackingName, 'hash': hash, 'url': dest })