Pass Parameters to Javascript Callback
posted by Jake on
Callback functions are a nice feature of Javascript. It's nice to be able to just use a function handle to show that it should be called when a certain something completes. Sometimes, however, we want to do more than just specify a function handle. We want to pass parameters. Why? Because sometimes the callback method cares about other data that was available before the original request. Here's an example:
As a part of the same voting mechanism that I wrote about for this article on event handler parameter passing, I wanted to keep id and (vote) direction around for the callback, which was to update the UI.
First, I made an ajax call with jquery to make vote updates to the database, and on my way to the ajax call, I would save the id and direction in a global (bad) variable. This works, because later, I can reference it in my callback function, updateUI:
var action = null; var objectid = null; function vote(id, direction) { action = direction; objectid = id; $.ajax({ type: 'POST', url: '/hymn/' + id + '/vote/' + direction + '/', dataType: 'json', async: false, timeout: 15000, success: updateUI }); }
The next solution is a bit cleaner and makes us feel better about ourself. Instead of the global, a closure is used, in which we decorate the response object with new state (id and direction); and since the response object is passed by default into the ajax callback function, it's available later by calling response.id or response.objectid:
function vote(id, direction) { $.ajax({ type: 'POST', url: '/hymn/' + id + '/vote/' + direction + '/', dataType: 'json', async: false, timeout: 15000, success: function (response) { response.action = direction response.objectid = id updateUI(response); } }); }
Sweet!