From b5594a773a6f07dcba914aa385f92d3305285b24 Mon Sep 17 00:00:00 2001 From: Karl Seamon Date: Fri, 22 Jul 2011 15:56:45 -0400 Subject: feat($xhr): add custom error callback to $xhr, $xhr.cache, $xhr.bulk, $resource Closes #408 --- src/Resource.js | 69 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 27 deletions(-) (limited to 'src/Resource.js') diff --git a/src/Resource.js b/src/Resource.js index 5462826d..3c149d8b 100644 --- a/src/Resource.js +++ b/src/Resource.js @@ -67,29 +67,36 @@ ResourceFactory.prototype = { forEach(actions, function(action, name){ var isPostOrPut = action.method == 'POST' || action.method == 'PUT'; - Resource[name] = function (a1, a2, a3) { + Resource[name] = function (a1, a2, a3, a4) { var params = {}; var data; - var callback = noop; + var success = noop; + var error = null; switch(arguments.length) { - case 3: callback = a3; + case 4: + error = a4; + success = a3; + case 3: case 2: if (isFunction(a2)) { - callback = a2; + success = a2; + error = a3; //fallthrough } else { params = a1; data = a2; + success = a3; break; } case 1: - if (isFunction(a1)) callback = a1; + if (isFunction(a1)) success = a1; else if (isPostOrPut) data = a1; else params = a1; break; case 0: break; default: - throw "Expected between 0-3 arguments [params, data, callback], got " + arguments.length + " arguments."; + throw "Expected between 0-4 arguments [params, data, success, error], got " + + arguments.length + " arguments."; } var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data)); @@ -97,23 +104,20 @@ ResourceFactory.prototype = { action.method, route.url(extend({}, action.params || {}, extractParams(data), params)), data, - function(status, response, clear) { - if (200 <= status && status < 300) { - if (response) { - if (action.isArray) { - value.length = 0; - forEach(response, function(item){ - value.push(new Resource(item)); - }); - } else { - copy(response, value); - } + function(status, response) { + if (response) { + if (action.isArray) { + value.length = 0; + forEach(response, function(item) { + value.push(new Resource(item)); + }); + } else { + copy(response, value); } - (callback||noop)(value); - } else { - throw {status: status, response:response, message: status + ": " + response}; } + (success||noop)(value); }, + error || action.verifyCache, action.verifyCache); return value; }; @@ -122,18 +126,29 @@ ResourceFactory.prototype = { return self.route(url, extend({}, paramDefaults, additionalParamDefaults), actions); }; - Resource.prototype['$' + name] = function(a1, a2){ - var params = extractParams(this); - var callback = noop; + Resource.prototype['$' + name] = function(a1, a2, a3) { + var params = extractParams(this), + success = noop, + error; + switch(arguments.length) { - case 2: params = a1; callback = a2; - case 1: if (typeof a1 == $function) callback = a1; else params = a1; + case 3: params = a1; success = a2; error = a3; break; + case 2: + case 1: + if (isFunction(a1)) { + success = a1; + error = a2; + } else { + params = a1; + success = a2 || noop; + } case 0: break; default: - throw "Expected between 1-2 arguments [params, callback], got " + arguments.length + " arguments."; + throw "Expected between 1-3 arguments [params, success, error], got " + + arguments.length + " arguments."; } var data = isPostOrPut ? this : undefined; - Resource[name].call(this, params, data, callback); + Resource[name].call(this, params, data, success, error); }; }); return Resource; -- cgit v1.2.3