2013-04-18 5 views
4

pas sûr si c'est possible mais je vais essayer. J'ai une fonction différée qui fait un appel au serveur pour créer ou mettre à jour et objecter. par exemple:Personnalisé JQuery différé gestionnaire

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; 
}; 

où les méthodes create et call retournent différées d'elles-mêmes. Cela me permettra d'appeler

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

Cependant, je voudrais pouvoir ajouter dans certains gestionnaires différés personnalisés afin que je puisse faire

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

Tout d'abord, est-ce possible. Et deuxièmement, si oui, comment je m'y prendrais.

Fondamentalement, je veux créer un gestionnaire différé personnalisé.

Merci beaucoup.

+0

vous devrez implémenter vous-même. –

+0

Je comprends cela. C'est ce que je cherche à faire. Et espérait des pointeurs: D –

+0

Que ferait '.created()' et '.updated()' pour vous que '.progress()', '.done()', '.fail()' ou ' .then() 'ne fais pas déjà? Je suggère que vous devez organiser les fonctions 'create()' et 'update()' pour résoudre leurs différés respectifs avec une certaine valeur (ou propriété d'un objet) qui identifie quelle action ('créer' ou 'mettre à jour') a réussi . Pourquoi rendre les choses plus compliquées? –

Répondre

1

Pas vraiment testé:

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 
    }); 
+0

Il a juste twigged pour moi pendant que je conduisais à la maison. C'est à peu près là où je me dirigeais. On dirait bien mais je vais vérifier le matin. –

1

Une solution est de faire vos propres $.Deferred objets et utiliser .resolve pour envoyer un param qui dit quelle méthode il est.

Par exemple:

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(); 
} 

Garder votre createOrUpdate même, vous pouvez utiliser .then, et vous serez passé deux params du .resolve.

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

Voici une petite démo: http://jsfiddle.net/U5jyJ/

Questions connexes