最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Return deferred promise object and resolve it - Stack Overflow

programmeradmin2浏览0评论

I have a function in form:

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

And now the question is: how to handle situation, when group_id == $(this).val()? I would like to do just:

var members_deferr = $.get_members();

members_deferr.done(function() {
  ...
});

One idea is to check type of returned value, but its not very nice. Second idea is to resolve deferred in setTimeout, but I don't know if it is safe.

Any other ideas?

I have a function in form:

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

And now the question is: how to handle situation, when group_id == $(this).val()? I would like to do just:

var members_deferr = $.get_members();

members_deferr.done(function() {
  ...
});

One idea is to check type of returned value, but its not very nice. Second idea is to resolve deferred in setTimeout, but I don't know if it is safe.

Any other ideas?

Share Improve this question edited Feb 25, 2014 at 13:35 marxin asked Feb 25, 2014 at 13:30 marxinmarxin 3,9224 gold badges34 silver badges47 bronze badges 0
Add a ment  | 

3 Answers 3

Reset to default 5

If in case group_id is currently selected and you have group members you just need to return resolved deferrent. Callback done() will be called right away, no need to check return type. Something like this:

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

I'm not quite sure what you are trying to do if val == group_id. Is this what you mean?

$.getMembers = function() {

    if ($(this).val() == $('#gid').val())
    {
        return $.Deferred().reject().promise();
    }

    return $.get(url).then(function() {
        // ...
    }).promise();
}

Late answer due to busy spell ...

The question hints at a jQuery plugin. If that is what you want, then you could do something like this :

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

Several design decisions needed to be made in writing this, so you might end up with something slightly different, depending on exactly what you want to do and how much control over the detailed behaviour you want to have.

发布评论

评论列表(0)

  1. 暂无评论