Retournez l'objet de la promesse différée et résolvez-le

J'ai une fonction dans la forme:

$.get_members = function() { var group_id = $('#gid').val(); if($(this).val() == group_id) return; var deferr = $.Deferred(); $.get(url) .done(function() { ... deferr.resolve(); }); return deferr.promise(); } 

Et maintenant, la question est: comment gérer la situation, quand group_id == $(this).val() ? Je voudrais simplement faire:

 var members_deferr = $.get_members(); members_deferr.done(function() { ... }); 

Une idée est de vérifier le type de valeur renvoyée, mais ce n'est pas très agréable. La deuxième idée est de résoudre différé dans setTimeout , mais je ne sais pas s'il est sécurisé.

D'autres idées?

Si au cas où group_id est actuellement sélectionné et que vous avez des membres du groupe, il vous suffit de renvoyer un différé différé. Callback done () sera appelé tout de suite, pas besoin de vérifier le type de retour. Quelque chose comme ça:

 $.get_members = function() { var group_id = $('#gid').val(); var deferr = $.Deferred(); if($(this).val() == group_id) { deferr.resolve(); } else { $.get(url) .done(function() { ... deferr.resolve(); }); } return deferr.promise(); } 

Je ne suis pas tout à fait sûr de ce que vous essayez de faire si val == group_id. C'est ce que tu veux dire?

 $.getMembers = function() { if ($(this).val() == $('#gid').val()) { return $.Deferred().reject().promise(); } return $.get(url).then(function() { // ... }).promise(); } 

Réponse tardive due à un sortilège occupé …

La question suggère un plugin jQuery. Si c'est ce que vous voulez, alors vous pouvez faire quelque chose comme ça:

 (function($){ var pluginName = 'get_members'; $.fn[pluginName] = function(url, otherValue) { var $this = $(this).eq(0), data = $this.data(pluginName); if(!data) { data = {}; $this.data(pluginName, data); } if(otherValue === undefined || $this.val() !== otherValue) { if(data.jqXHR) { data.jqXHR.abort(); } data.jqXHR = $.get(url).done(function(response, textStatus, jqXHR) { ... }); } return data.jqXHR || $.Deferred().reject(pluginName + ': conditions for fetching members have not been met'); } })(jQuery); //Normal usage var promise_of_members = $("#myInputElement").get_members('http://my/url', $("#gid").val()); //or var promise_of_members = $("#myInputElement").get_members('http://my/url', 'myComparisonString'); //Force get var promise_of_members = $("#myInputElement").get_members('http://my/url'); 

Plusieurs décisions de conception doivent être faites par écrit, de sorte que vous pourriez vous retrouver avec quelque chose de légèrement différent, selon exactement ce que vous voulez faire et combien de contrôle le comportement détaillé que vous voulez avoir.