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
   79   80   81   82   83   84   85   86   87   88   89