【问题标题】:Return deferred promise object and resolve it返回延迟的承诺对象并解决它
【发布时间】:2014-03-08 18:51:58
【问题描述】:

我有一个函数形式:

$.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中解决deferred,但不知道是否安全。

还有其他想法吗?

【问题讨论】:

    标签: javascript jquery deferred


    【解决方案1】:

    如果当前选择了 group_id 并且您有组成员,则只需返回已解决的延迟。回调 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();
    }
    

    【讨论】:

    • 它是如何工作的?我在想,如果我在将函数绑定到done() 回调之前调用resolve(),当然会调用done(),但它还没有绑定(因为它在获取deffer.promise() 后绑定)。我错了吗?
    • 检查,它有效。像 .done(...) 这样的绑定回调失败,即使在解决/拒绝之后也始终有效。考虑这样的实现: Deferred.done = function(callback) { if (this.state==='pending') this.waitingDones.push(callback); else if (this.state==='succeeded') callback(); }
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      因为忙,回答迟了……

      这个问题暗示了一个 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');
      

      在编写此代码时需要做出几个设计决策,因此您最终可能会得到一些稍微不同的东西,具体取决于您想要做什么以及对您想要拥有的详细行为的控制程度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        • 2017-07-18
        • 1970-01-01
        • 2011-06-30
        • 2015-03-29
        • 2022-01-18
        相关资源
        最近更新 更多