var config = { json: { baseUrl: "/some/url/$", getter: $.getJSON, validator: $.isPlainObject }, template: { baseUrl: "/some/url/$.mustache", getter: $.get, validator: function (str) { return (/\{\{[a-zA-Z._]*\}\}/).test(str); } } }; function getItem(itemOrName, type) { var result = $.Deferred(), cfg = config[type]; if (cfg.validator(itemOrName)) { result.resolve(itemOrName); } else { cfg.getter(cfg.baseUrl.replace("$", itemOrName)) .done(function (data) { result.resolve(data); }) .fail(function (xhr) { result.reject(xhr); }); } return result.promise(); } var foo = { tmplReplaceContent: function (json, tmpl, target) { $.when(getItem(json, "json"), getItem(tmpl, "template")) .done(function (json, tmpl) { var content = Mustache.render(tmpl, json); $(target).html(content).hide().fadeIn(); }) .fail(function (xhr) { // show error message }); } };