2015-07-07 3 views
1

Я просто пытаюсь демистифицировать, как метод $.Deferred работает в jQuery. Я знаю, что он в основном используется для AJAX, но я также хотел бы использовать этот метод для вещей, отличных от AJAX. Я читал the jQuery documentation по этому методу и наткнулся на следующий фрагмент кода:

$.fn.bindOnce = function(event, callback) { 
    var element = $(this[ 0 ]), 
     defer = element.data("bind_once_defer_" + event); 

    if (!defer) { 
     defer = $.Deferred(); 
     function deferCallback() { 
      element.unbind(event, deferCallback); 
      defer.resolveWith(this, arguments); 
     } 
     element.bind(event, deferCallback) 
     element.data("bind_once_defer_" + event , defer); 
    } 

    return defer.done(callback).promise(); 
    // what is this piece of code really doing and why is it necessary ? 
}; 

... Теперь, если вы идете через код построчно его довольно легко под что происходит.

Документация JQuery говорит нам, Что линия происходит по линии, например, так:

  • Проверьте, если элемент уже отложенное прилагается к данному событию
  • если нет, то создать его и сделать его поэтому он разрешается, когда событие запускается в первый раз около
  • затем присоединяет данный обратный вызов к отложенному и возвращает обещание.

трудности у меня есть и линия, однако, что я не могу понять, ниже:

return defer.done(callback).promise(); 

Я не понимаю, цель этой строки кода и почему это полезно и что именно это метод обещаний, выполняемый в этом сценарии?

Может ли кто-нибудь объяснить?

+0

Не могли бы вы принять к сведению [усовершенствования форматирования, сделанные для вашего сообщения] (http://stackoverflow.com/posts/31263269/revisions), и применять их в будущем? Ваши вопросы имеют историю изначально плохо отформатированы и должны быть отредактированы/улучшены редакторами. – Matt

+0

@Matt Конечно, отметьте это! :) благодаря –

ответ

2

promise() создает обещание объект для отложенного. Объект-обещание предоставляет подмножество методов, доступных для отложенных; которые позволяют клиентам регистрировать обработчики событий для различных событий, но не изменить отложенное.

От jQuery docs:

Обещание объекта обеспечивает подмножество методов Deferred объекта (then, done, fail, always, pipe, progress, state и promise), чтобы пользователи не изменяя состояние отложенного.

Поэтому

return defer.done(callback).promise(); 

... добавляет функцию callback будет выполняться при отсроченной (defer) решает, а затем возвращает соответствующее обещание для отсроченной.

Возможно, вам будет полезен следующий вопрос: What are the differences between Deferred, Promise and Future in JavaScript?