Annullamento di una promessa differita in jQuery
-
09-12-2019 - |
Domanda
Come posso annullare una promessa senza rimuovere l'elemento dal DOM?
Ho eseguito questo codice:
$("#box")
.delay(2000)
.show("slow")
.delay(2000)
.promise()
.then(function(){log("Done");});
Dopodiché c'è un modo per annullare la promessa?Entrambi clearQueue()
E stop(true)
non ha funzionato, perché non è un'animazione che sto cercando di annullare.l'ho visto remove()
dovrebbe farlo...ma voglio solo interrompere la promessa, non eliminare l'intero elemento.
Soluzione
Buone notizie.Da ieri puoi annullare la tua promessa.
Ho pubblicato la nuova versione del mio piccolo plugin jquery-timing che fornisce due metodi tra molti altri chiamati .wait() e .unwait().
var deferred = $("#box").delay(2000).show("slow").delay(2000).promise();
$.wait(deferred, function(){ log("Done"); });
Se poi desideri annullare la registrazione della richiamata:
$.unwait();
Queste versioni statiche di wait e unwait supportano anche un nome di gruppo opzionale per non annullare alcun gestore ma solo un set specifico.
Oltre a ciò puoi fare molte cose più intelligenti come:
$('#box').wait(deferred).addClass('ready');
o l'intero codice in una catena, senza opzione unwait:
$("#box").delay(2000).show("slow")
.delay(2000).join(function(){log("Done");})).addClass('ready');
oppure lo stesso anche più breve con possibilità di annullare le due pause:
$("#box").wait(2000).show("slow",$)
.wait(2000, function(){log("Done");})).addClass('ready');
Basta vedere la documentazione, gli esempi e l'API che si adatta meglio a te.
Altri suggerimenti
Credo che tu possa usare $('#box').remove();
Dalla documentazione jQuery qui: http://api.jquery.com/promise/
La Promise restituita è collegata a un oggetto Deferred memorizzato su .data() per un elemento.Poiché il metodo .remove() rimuove i dati dell'elemento così come l'elemento stesso, impedirà la risoluzione di qualsiasi Promessa irrisolta dell'elemento.Se è necessario rimuovere un elemento dal DOM prima che la sua Promessa venga risolta, utilizzare invece .detach() e proseguire con .removeData() dopo la risoluzione."
Non suppongo che vorresti qualcosa del genere http://jsfiddle.net/2cq8M/ ?Sto coinvolgendo due promesse (una solo per gestire il caso alla fine della serie di animazioni, l'altra per risolverlo o rifiutarlo secondo necessità).
In questo caso desideri utilizzare un differito anziché una promessa, tuttavia, puoi utilizzare la promessa dell'animazione per risolvere il differito.
var stopDone = true;
function log(msg) {
$(".debug").append(new Date() + " - " + msg + "<br/>");
}
log("Starting");
var boxAnimation = new $.Deferred();
boxAnimation.done(function() {
log("Done");
});
boxAnimation.fail(function() {
log("Stopped");
});
$("#box").delay(2000).show("slow").delay(2000).promise().then(function() {
boxAnimation.resolve(); // when all the animations are done, resolve the deferred.
});
if (stopDone)
{
boxAnimation.reject();
}
Come nota a margine, i differiti possono essere rifiutati o risolti solo una volta.Una volta rifiutati o risolti, non è possibile modificare il loro stato.