Underscore Mixin for Error Handling
A common pattern that pops up in my node.js programming is this:
// callback is defined elsewhere object.someAsyncFunction(param1, function(err, response) { if (err) { return callback(err); } // do something with response callback(undefined, transformedResponse); });
When I'm really paranoid about ensuring the callback is called I wrap the code in a try/catch:
// callback is defined elsewhere object.someAsyncFunction(param1, function(err, response) { if (err) { return callback(err); } try { // do something with response callback(undefined, transformedResponse); } catch(err) { callback(err); } });
Talk about a lot of boilerplate code. Since I use underscore heavily throughout my code I created the following mixin:
_.mixin({
    errTryWrap: function(fn, callback, context) {
        return function() {
            // check for err
            if (arguments[0]) {
                return callback(arguments[0]);
            }
            try {
                // strip the err from the arguments passed down
                return fn.apply(context, _.rest(arguments));
            } catch(err) {
                callback(err);
            }
        };
    }
});
With that in place the paranoid version now becomes:
// callback is defined elsewhere object.someAsyncFunction(param1, _.errTryWrap(function(response) { // do something with response callback(undefined, transformedResponse); }, callback));
Much cleaner. I'm not crazy about the name of the mixin but it makes it easy to find in the code should I come up with a better name later.
Comments
Posted by: Daniel R.
 |
                                 September 24, 2012 11:53 AM