2014-12-04 2 views
0

Мне нужна помощь в понимании использования отложенных методов, таких как promise() и done().Как работают отложенные заявления, такие как prom() и done()?

1-й) В этом примере для анимации добавляется .promise(), в котором вызывается done().

 var stack = new Array(); 

     $(document).ready(function() { 
      $(".droppable").each(function(){ 
       stack.push(new Droppable($(this))); 
      }); 
      dropNext(); 
     }); 

     function dropNext(){ 
      var droppable = stack.pop(); 
      if(droppable){     
       droppable.drop().done(dropNext); 
      } 
     } 

     function Droppable(domElem) { 

      function drop() { 
       return domElem.animate(
        { 
         opacity : "1" 
        } 
       ).promise(); 
      } 
      this.drop = drop; 
     } 

Какова цель обещания? Как это работает?

2-й) Документы JQuery дают this sort of example с $ .get, но не знают, как это по-другому, чем при использовании анонимной функции обратного вызова, которая уже снабжена $.get():

$.get("test.php", {}, 
     function (result) { 
      alert(result); 
     } 
    ); 


    $.get("test.php").done(
     function(result) { 
      alert(result); 
     } 
    ); 

Не анонимная функции уже обратный вызов для получения результатов, которые будут проанализированы при их возврате с сервера?

+3

Вы должны пройти через обещание шаблон, чтобы понять причину https://www.promisejs.org/patterns/ – mz17

+0

Цель 1-го обещания(). Done() состоит в том, чтобы дождаться ** всех ** анимаций/методов, помещенных в очередь для согласованного элемента (ов), который будет успешно завершен (разрешен). '// Получите обещание, разрешенное, когда очереди определенного типа \t // освобождены (fx - это тип по умолчанию). JQuery поместил всю анимацию по умолчанию в очередь fx. –

+0

Согласен с @MayankGupta - вам будет намного лучше Google 'javascript prom' и чтение в какой-то документации' обещания', чтобы вы могли понять, что они собой представляют. Их полезность не ограничивается jQuery 'animate' – Adam

ответ

1

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

Для вашего первого примера animate занимает некоторое время, поэтому возвращается promise, который разрешает, когда выполняется анимация, позволяет убедиться, что предыдущая анимация закончена до следующего. Он говорит: «Я говорю вам, что делать сейчас, но не делайте этого до тех пор, пока это не будет сделано.« Если ваш список stack здесь имеет 5 элементов, вы можете перебирать их и связывать их с код выше. Чтобы сделать это с обратным вызовом, у вас будут обратные вызовы, вложенные в 5 уровней.

Мясо обещания - then, позволяющее нескольким операциям соединяться вместе. Глядя на $.get Например, представьте, что вы хотите сделать несколько вызовов API, которые зависят друг от друга:

$.get("test.php", {}, 
    function (result) { 
     $.post("test-details.php", {data: result}, function(detail) { 
      $.get("test-content.php", {id: detail.id}, function(content) { 
       // do content stuff 
       // whoa, this is getting deep 
      }); 
     }); 
    } 
); 

Вы можете придавить это с помощью обещаний.

$.get("test.php").then(function(result) { 
    return $.post("test-details.php", {data: result}); 
}).then(function(detail) { 
    return $.get("test-content.php", {id: detail.id}); 
}).then(function(content) { 
    // do content stuff 
}); 

Вы можете уловить любые ошибки, которые происходят по пути, позволяя перейти к концу цепи.

Для дальнейшего чтения, я рекомендую You're missing the point of promises и [Promise Anit- https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns) (от Bluebird.)

+0

Отличное описание, несмотря на мой неясный вопрос. Спасибо за это. В вашем примере с 'then()', я не вижу 'prom()' - is 'then()' просто цепочки версии 'prom()'? Кроме того, где 'done()' выполняется в этой последовательности? – Growler

+1

'then' является основным методом, представленным обещанием. В jQuery результатом вызова 'ajax' (get/post) является« обещание », поэтому вам не нужно явно его вызывать. Для примера «animate» вы можете называть 'then' вместо' done'; 'done' - это то же самое, что и' then', за исключением того, что он сообщает вам, что цепочка обещаний фактически завершена. – Mathletics

+1

Чтобы быть понятным, 'prom()' используется для фактического получения объекта prom, чтобы его можно было вернуть. 'then',' done', 'catch' и т. д. являются методами объекта' prom', которые позволяют вам делать что-то с _value_, которое возвращается, когда обещание 'resolve'd. – Mathletics

Смежные вопросы