Custom jQuery deferred handler

Not sure if this is possible, but I will give him everything. I have a deferred function that calls a server call to create or update both an object. eg:

var createOrUpdate = function(item) { var self = this; var deferred; if (item.id && item.id > 0) { updated = true; deferred = update.call(self, params); } else { deferred = create.call(self); } return deferred; }; 

where the create and call methods are returned deferred. This will let me call

 foo.createOrUpdate(bar).then(function(response) { // something happened }); 

However, I would like to be able to add pending entries to some user-defined handlers so that I can do this

 foo.createOrUpdate(bar).created(function(response) { // an item was created }).updated(function(response) { //an item was updated }); 

First, is it possible. And secondly, if so, how would I do it.

Basically I want to create a custom deferred handler.

Thank you very much.

+4
source share
2 answers

Not tested:

 var createOrUpdate = function(item) { return { isUpdated : item.id && item.id > 0, created : function(cb) { if (! this.isUpdated) create.call(self).then(cb); return this; }, updated : function(cb) { if (this.isUpdated) update.call(self, params).then(cb); return this; } }; }; foo.createOrUpdate(bar) .created(function(response) { // an item was created }) .updated(function(response) { //an item was updated }); 
+1
source

One solution is to create your own $.Deferred objects and use .resolve to send a parameter that says which method.

For instance:

 function create(){ var deferred = new $.Deferred; $.post('/your/AJAX/call', {your: data}, function(retData){ deferred.resolve('create', retData); }); return deferred.promise(); } function update(params){ var deferred = new $.Deferred; $.post('/your/AJAX/call', {your: data, also: params}, function(retData){ deferred.resolve('update', retData); }); return deferred.promise(); } 

While keeping createOrUpdate the same, you can use .then and both parameters from .resolve will be passed to you.

 foo.createOrUpdate(bar).then(function(method, response) { switch(method){ case 'update': break; case 'create': break; } }); 

Here is a small demo: http://jsfiddle.net/U5jyJ/

+1
source

All Articles