繁体   English   中英

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

[英]Return deferred promise object and resolve it

我有一个形式的功能:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM