返回延迟的promise对象并解决它

我有一个forms的function:

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

现在问题是:当group_id == $(this).val()时,如何处理情况? 我想做的只是:

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

一个想法是检查返回值的类型,但它不是很好。 第二个想法是解决setTimeout延迟,但我不知道它是否安全。

还有其他想法吗?

如果在当前选择了group_id并且您有组成员,则只需返回已解决的deferrent。 将立即调用callback done(),无需检查返回类型。 像这样的东西:

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

如果val == group_id,我不太确定你要做什么。 你是这个意思吗?

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

由于忙碌而迟到的答案……

这个问题暗示了一个jQuery插件。 如果这是你想要的,那么你可以这样做:

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

在写这篇文章时需要做出一些设计决定,因此你最终会得到一些略有不同的东西,具体取决于你想要做什么以及对你想要的详细行为的控制程度。