analytics: Use deferreds to prevent duplicate fetch-trackers requests.

This commit is contained in:
Max Goodman
2013-02-03 23:44:00 -08:00
parent 1870a3e474
commit 768a8cb743

View File

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