我有一个函数:
$.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
中的延迟,但我不知道它是否安全。
还有其他想法吗?
答案 0 :(得分:5)
如果当前选择了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();
}
答案 1 :(得分:1)
如果val == group_id,我不太清楚你要做什么。这是你的意思吗?
$.getMembers = function() {
if ($(this).val() == $('#gid').val())
{
return $.Deferred().reject().promise();
}
return $.get(url).then(function() {
// ...
}).promise();
}
答案 2 :(得分:0)
由于忙碌而迟到的答案......
这个问题暗示了一个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');
在写这篇文章时需要做出几个设计决定,所以你可能会得到一些略有不同的东西,具体取决于你想要做什么以及对你想要的详细行为有多少控制。