Question

Comment puis-je annuler une promesse sans supprimer l’élément du DOM ?

violon

J'ai exécuté ce code :

$("#box")
  .delay(2000)
  .show("slow")
  .delay(2000)
  .promise()                            
  .then(function(){log("Done");});

Après cela, y a-t-il un moyen d’annuler la promesse ?Les deux clearQueue() et stop(true) n'a pas fonctionné, car ce n'est pas une animation que j'essaie d'annuler.j'ai vu ça remove() devrait le faire...mais je veux seulement arrêter la promesse, pas supprimer l'intégralité de l'élément.

Était-ce utile?

La solution

Bonnes nouvelles.Depuis hier, vous pouvez annuler votre promesse.

J'ai publié la nouvelle version de mon petit plugin jQuery-timing qui fournit deux méthodes parmiBeaucoup d'autres ont appelé. Aït () et .Unwait ().

var deferred = $("#box").delay(2000).show("slow").delay(2000).promise();
$.wait(deferred, function(){ log("Done"); });

Si vous souhaitez alors désenregistrer le rappel:

$.unwait();

Ces versions statiques d'attente d'attente et dedirent également un nom de groupe optionnel pour n'annuler aucun gestionnaire, mais seulement un ensemble spécifique.

En plus que vous puissiez faire beaucoup plus de choses intelligentes comme:

$('#box').wait(deferred).addClass('ready');

ou le code entier dans une chaîne, sans option de vidage de la vidage:

$("#box").delay(2000).show("slow")
  .delay(2000).join(function(){log("Done");})).addClass('ready');

ou la même chose encore plus courte avec la possibilité d'annuler les deux pauses:

$("#box").wait(2000).show("slow",$)
  .wait(2000, function(){log("Done");})).addClass('ready');

Voyez juste voir les docs, les exemples et l'API, ce qui vous convient le mieux.

Autres conseils

Je pense que vous pouvez utiliser $('#box').remove();

de la documentation de jQuery ici: http://api.jquerery.com/promise/

La promesse retournée est liée à un objet différé stocké sur le .Data () pour un élément.Étant donné que la méthode .ReMove () supprime les données de l'élément ainsi que l'élément lui-même, il empêchera l'un des promesses non résolues de l'élément de résoudre.S'il est nécessaire de supprimer un élément de la DOM avant que sa promesse ne soit résolue, utilisez .Détach () à la place et suivez avec .Removedata () après la résolution. "

Je ne suppose pas que vous voudriez quelque chose comme http://jsfiddle.net/2cq8m/ ?J'implique deux promesses (une seule pour gérer l'affaire à la fin de l'ensemble des animations, l'autre pour résoudre ou rejeter selon les besoins).

Vous voulez utiliser un différé dans ce cas au lieu d'une promesse, vous pouvez utiliser la promesse de l'animation pour résoudre le différé.

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

comme une note latérale, les différés ne peuvent être rejetés ou résolus qu'une seule fois.Une fois qu'ils sont rejetés ou résolus, vous ne pouvez pas changer d'état.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top