Отмена отложенного обещания в jQuery - PullRequest
11 голосов
/ 08 марта 2012

Как я могу отменить обещание без удаления элемента из DOM?

fiddle

Я запустил этот код:

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

После этого есть ли способ отменить обещание?И clearQueue(), и stop(true) не сработали, потому что это не анимация, которую я пытаюсь отменить.Я видел, что remove() должен это сделать ... но я только хочу остановить обещание, а не удалить весь элемент.

Ответы [ 4 ]

4 голосов
/ 09 августа 2012

Хорошие новости.Со вчерашнего дня вы можете отменить свое обещание.

Я опубликовал новую версию моего небольшого плагина jquery-timer , который предоставляет два метода среди многих других, называемых .wait () и .unwait ().

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

Если вы затем хотите отменить регистрацию обратного вызова:

$.unwait();

Эти статические версии wait и unwait также поддерживают необязательное имя группы, чтобы не отменять какой-либо обработчик, а только определенный набор.

Кроме того, вы можете делать намного более умные вещи, такие как:

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

или весь код в одной цепочке, без опции ожидания:

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

илито же самое еще короче с возможностью отменить две паузы:

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

Просто посмотрите документы, примеры и API, которые подходят вам лучше всего.

2 голосов
/ 08 марта 2012

Полагаю, вы можете использовать $('#box').remove();

Из документации jQuery здесь: http://api.jquery.com/promise/

Возвращенное обещание связано с отложенным объектом, сохраненным в .data () для элемента.Так как метод .remove () удаляет данные элемента, а также сам элемент, он предотвращает разрешение любого из неразрешенных обещаний элемента.Если необходимо удалить элемент из DOM до разрешения его Promise, используйте вместо него .detach () и добавьте .removeData () после разрешения. "

1 голос
/ 17 апреля 2012

Вы хотите использовать отложенное в этом случае вместо обещания, однако вы можете использовать обещание анимации для разрешения отложенного.

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

Как примечание, отложенные платежи могут быть отклонены или разрешены только один раз. После того, как они отклонены или разрешены, вы не можете изменить их состояние.

1 голос
/ 08 марта 2012

Не думаю, что вы захотите что-то вроде http://jsfiddle.net/2cq8M/? Я имею в виду два обещания (одно только для обработки случая в конце набора анимаций, другое для разрешения или отклонения по мере необходимости).

...