Domanda

Come posso annullare una promessa senza rimuovere l'elemento dal DOM?

violino

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.

È stato utile?

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.

http://jsfiddle.net/LG9eZ/9/

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top