marxin
marxin

Reputation: 3922

Return deferred promise object and resolve it

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?

Upvotes: 3

Views: 6805

Answers (3)

Beetroot-Beetroot
Beetroot-Beetroot

Reputation: 18078

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.

Upvotes: 0

Remigijus Pankevičius
Remigijus Pankevičius

Reputation: 1132

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

Upvotes: 5

Douglas
Douglas

Reputation: 37781

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

Upvotes: 1

Related Questions