2014-12-01 4 views
2

Я борюсь с обещаниями и анимациями jQuery. Это упрощенный случай:Цепочки jQuery обещают выполнить ранние

var title = $('#intro h2'); 
title.fadeOut(2000).promise() 
    .then(function() { title.fadeIn(4000); }) 
    .then(function() { title.css({'background-color':'red'}); }); 

Я ожидаю, что заголовок ($('#intro h2')) постепенно исчезать, а затем исчезают, и затем на его цвет фона изменится на красный. Вместо этого фон меняется на красный до заголовок возвращается обратно.

Что происходит?

Как я могу использовать обещания для обеспечения правильной последовательности событий?

+0

Похоже, что вы должны использовать 'queue' JQuery для этого поведения, а не' promise'. – zzzzBov

ответ

4

Ваш then обратный вызов не возвращает обещание, так что обещание цепи не знает, что ждать. Он не ждет undefined. Используйте

title.fadeOut(2000).promise().then(function(){ 
    return title.fadeIn(4000).promise(); 
// ^^^^^^     ^^^^^^^^^^ 
}).then(function() { 
    title.css({'background-color':'red'}) 
}) 

Обратите внимание, что эта анимация также может быть сделано с помощью очереди анимации в одиночку:

title.fadeOut(2000).fadeIn(4000, function(){title.css('background-color','red')}) 
+0

Спасибо за ответ. –

+0

Я знал о цепочке '$ foo.fadeOut (t) .fadeIn (t2);' но мой фактический прецедент более сложный, и пример был самым простым, о котором я мог думать, чтобы показать, что я испытывал. Фактический прецедент включает в себя создание вспомогательных функций для стандартизации поведения анимации (выбор времени, ослабление, возврат обещаний) по нескольким анимационным эффектам. Проблема возникла без сложностей вспомогательных функций, поэтому я только дал этот упрощенный пример. –

1

Вам необходимо вернуть обещание анимации постепенного превращения с вашего первого обратного вызова then().

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

title.fadeOut(2000).promise() 
    .then(function() { return title.fadeIn(4000).promise(); }) 
    .then(function() { title.css({'background-color':'red'}); }); 
Смежные вопросы