Return the deferred promise object and resolve it

I have a function in the 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 arises: how to handle the situation when group_id == $(this).val()? I would like to do only:

var members_deferr = $.get_members();

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

One idea is to check the type of the return value, but this is not very nice. The second idea is to allow pending in setTimeout, but I don't know if it is safe.

Any other ideas?

+3
source share
3 answers

If you select group_id and you have group members, you just need to return the allowed deferrent. The done () callback will be called immediately, there is no need to check the return type. Something like that:

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

, , val == group_id. , ?

$.getMembers = function() {

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

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

- ...

The question prompts the jQuery plugin. If this is what you want, then you can 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');

When writing this document, you need to make some design decisions so that you can get something a little different, depending on what you want to do and how much control over the detailed behavior you want to have.

0
source

All Articles