Page 84 - jQuery для начинающих
P. 84
Поясню происходящее – AJAX запрос и анимация стартуют одновременно, когда и тот и
другой завершат свою работу, будет вызвана функция, которую мы передаём в качестве
аргумента в метод then() (одна из двух, в зависимости от исхода происходящего). Для
обеспечения работы этой «магии» методы when(), ajax() и animate() реализуют
интерфейс Deferred. Пример работы на странице when.html
Теперь можно и заумно – метод when() возвращает проекцию Deferred объекта,
принимает в качестве параметров произвольное множество Deferred объектов,
когда все из них отработают, объект when изменит своё состояние в
«выполнено», с последующим вызовом всех подписавшихся.
А ещё, кроме поведения «ждём всех», с помощью Deferred можно выстраивать цепочки
вызовов – «живые очереди»:
$.ajax('ajax/example.json')
.pipe(function(){
// ждём окончания AJAX запроса
return $('article img').slideUp(2000)
})
.pipe(function(){
// ждём пока спрячутся картинки
return $('article p').slideUp(2000)
})
.pipe(function(){
// ждём пока спрячутся параграфы
return $('article').hide(2000);
})
.done(function(){
// всё сделано шеф
});
Подобное поведение можно воспроизвести используя лишь animate, но нам же
хочется заглянуть чуть-чуть поглубже - deferred.pipe.html
В данном примере мы вызываем метод pipe(), которому скормлена callback-функция,
которая должна возвращать объект Deferred, это необходимо для соблюдения порядка в
очереди – попробуйте убрать в примере один return, и вы заметите, что следующая
анимация наступит не дождавшись завершения предыдущей.
84
www.trk.kg