Отмена отложенного обещания в jQuery
Как я могу отменить обещание, не удаляя элемент из DOM?
fiddle
Я запустил этот код:
$("#box")
.delay(2000)
.show("slow")
.delay(2000)
.promise()
.then(function(){log("Done");});
После этого есть ли способ отменить обещание? Оба clearQueue()
и stop(true)
не работали, потому что это не анимация, которую я пытаюсь отменить. Я видел, что remove()
должен это делать... но я хочу только прекратить обещание, а не удалить весь элемент.
Ответы
Ответ 1
Хорошие новости. Со вчерашнего дня вы можете отменить свое обещание.
Я опубликовал новую версию моего небольшого плагина jquery-timing, который предоставляет два метода среди многих других:.wait() и .unwait().
var deferred = $("#box").delay(2000).show("slow").delay(2000).promise();
$.wait(deferred, function(){ log("Done"); });
Если вы хотите отменить регистрацию обратного вызова:
$.unwait();
Эти статические версии wait и unait также поддерживают необязательное имя группы, чтобы не отменить какой-либо обработчик, а только определенный набор.
Кроме того, вы можете сделать гораздо больше умных вещей, таких как:
$('#box').wait(deferred).addClass('ready');
или весь код в одной цепочке, без опций unait:
$("#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
Я считаю, что вы можете использовать $('#box').remove();
Из документации jQuery здесь: http://api.jquery.com/promise/
Возвращаемое обещание связано с объектом Отложенного, хранящимся в .data() для элемента. Поскольку метод .remove() удаляет данные элемента, а также сам элемент, он предотвратит решение любого из неразрешенных Promises элементов. Если необходимо удалить элемент из DOM до того, как его обещание будет разрешено, используйте вместо него .detach() и следуйте за .removeData() после разрешения. "
Ответ 3
Я не думаю, что вам нужно что-то вроде http://jsfiddle.net/2cq8M/? Я задействую два promises (один для обработки дела в конце набора анимаций, другой для разрешения или отклонения по мере необходимости).
Ответ 4
Вы хотите использовать отложенное в этом случае вместо обещания, однако вы можете использовать обещание анимации для разрешения отложенного.
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();
}
В качестве примечания стороны, отсрочки могут только отклоняться или разрешаться один раз. Как только они отвергнуты или разрешены, вы не можете изменить свое состояние.