Restituire l'oggetto Promise differito e risolvilo
-
21-12-2019 - |
Domanda
Ho una funzione nella forma:
$.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();
}
.
E ora la domanda è: come gestire la situazione, quando group_id == $(this).val()
?Mi piacerebbe fare solo:
var members_deferr = $.get_members();
members_deferr.done(function() {
...
});
.
Un'idea è di controllare il tipo di valore restituito, ma non è molto bello.La seconda idea è di risolvere differita in setTimeout
, ma non so se è sicuro.
Qualche altra idea?
Soluzione
Se in Case Group_ID è attualmente selezionato e si dispone di membri del Gruppo è solo necessario restituire il deferimento risolto.Callback Fatto () verrà chiamato subito, non è necessario controllare il tipo di ritorno.Qualcosa del genere:
$.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();
}
. Altri suggerimenti
Non sono sicuro di cosa stai cercando di fare se val== group_id.È questo cosa intendi?
$.getMembers = function() {
if ($(this).val() == $('#gid').val())
{
return $.Deferred().reject().promise();
}
return $.get(url).then(function() {
// ...
}).promise();
}
. Risposta tardiva a causa di incantesimo occupato ...
La domanda suggerisce in un plugin jQuery.Se è quello che vuoi, allora potresti fare qualcosa del genere:
(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');
.
Diverse decisioni di progettazione necessarie per essere effettuate per iscritto questo, in modo da poter finire con qualcosa di leggermente diverso, a seconda di esattamente cosa vuoi fare e quanto controllo sul comportamento dettagliato che desideri avere.