Tuesday, September 10, 2013

jQuery deferred resolution and rejection based on boolean value

Do you hate writing this as much as I do?

    var dfd = $.Deferred();
    if (something) {
        dfd.resolve();
    } else {
        dfd.reject();
    }

Well no more!  Enter "cond".

$.Deferred = (function (baseDeferred) {
  var slicer = [].slice;
 
  var cond = function (truthy) {
    return this[truthy ? 'resolve' : 'reject'].apply(this, slicer.call(arguments, 1));
  };
 
  return function() {
    var dfd = baseDeferred.apply(this, arguments);
    dfd.cond = cond;
    return dfd;
  };
 
})($.Deferred);

Unfortunately, as shown by the relative complexity of this code, jQuery doesn't actually use a prototype for the deferred objects it creates, so you have to 'duck punch' the feature in.

Usage (after including the previous script somewhere):

var dfd = $.Deferred();

dfd.cond(true, { some: 'data' });

dfd.then(function (res) {
    console.log(res);
});