Что такое хуки и обратные вызовы jQuery? - PullRequest
11 голосов
/ 18 июля 2011

Мне трудно осмыслить, что такое обратные вызовы или перехватчики в jQuery.Кажется, они объединены, но я не знаю разницы между ними.

Из того, что я понимаю из других постов о обратных вызовах, таких как this , обратный вызов - это просто функция Aчто вы передаете другой функции B, которая вызывает A, как только B.(Это может быть совершенно неправильно, поправьте меня, если так).

У меня действительно нет никакого понятия о хуках, кроме утверждения «вы должны использовать хук / обратный вызов».Что-то заставляет меня сомневаться, что они такие похожие ...

Ответы [ 2 ]

13 голосов
/ 18 июля 2011

Ваше определение близко, но недостаточно. Обратный вызов - это функция A, которую вы передаете другой функции B (или объекту B), которую B будет вызывать в соответствующей точке .

Для некоторых функций «соответствующая точка» находится после завершения этой функции, как вы описали.

Многие функции или объекты определяют набор "определенных точек" или событий, когда могут быть вызваны обратные вызовы. Например, если у вас есть элемент управления, который периодически обновляется через AJAX, он может определить событие, которое происходит, когда он собирается обновить, событие, которое происходит после возврата обновления, и событие, которое происходит после отображения результатов. Для любого из этих событий вы можете передать ему свою пользовательскую функцию, которая должна вызываться при возникновении этого события.

Этот определенный набор точек, где может быть вызвана пользовательская функция, - это то, что люди подразумевают под "зацепками". Это места, где вы можете подключить свои функции в готовую библиотеку.

Отредактировано, чтобы добавить:

ОП попросил простой пример хука.

Допустим, я написал функцию, которая берет список имен пользователей и предназначена для просмотра списка, просмотра сведений о каждом человеке и возврата заполненного списка объектов людей.

Может быть, я хочу дать программисту, использующему мою функцию, возможность указать, что должно произойти, если имя пользователя не найдено в моей базе данных. Один программист может захотеть, чтобы функция выдавала ошибку, другой мог бы просто игнорировать отсутствующий пример, другой мог бы захотеть, чтобы она смотрела в другой базе данных, другой мог бы хотеть, чтобы она создала пустой объект person.

Так что моя подпись функции может быть что-то вроде

function getPeople( arrayOfUsernames, missingUsernameCallback )

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

missingUsernameCallback( notFoundUsername );

Теперь программист может вызывать функцию как

getPeople( ["adam","betty","charlie"], function(name){ alert("Missing username " + name)} );

и всякий раз, когда я нажимаю пропущенное имя пользователя, я вызываю переданную мне функцию.

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

   getPeople( ["adam","betty","charlie"], 
        {startOfListCallback:      function(){ alert("I'm starting the list")},
         missingUsernameCallback:  function(){ alert("Missing username"!)},
         endOfListCallback:        function(){ alert("I'm at the end of the list") });

и т.д.. Список возможных обратных вызовов будет определяться функцией и должен быть в документации API (вместе с параметрами, которые могут быть переданы в обратные вызовы и т. Д.). Этот список обратных вызовов - это хуки.

1 голос
/ 18 июля 2011

Я думаю, в контексте того, что вы использовали слово «люди», подразумевают обратные вызовы, которые в точности соответствуют вашим ожиданиям (в случае с jQuery ловушка и обратный вызов - это одно и то же).

Обратный вызов для функции animate () jQuery, например, будет выполнен, как только анимация завершится.

Некоторые встроенные функции и другие плагины jQuery могут определять несколько обратных вызовов для различных этапов выполнения. Например, плагин, который отображает всплывающее окно для пользователя, может иметь обратный вызов, когда пользователь нажимает на ссылку, чтобы показать окно, но до того, как окно действительно отобразится (этот обратный вызов может использоваться для хранения некоторых данных, которые будут отображаться в реальном всплывающем окне нужно, например). Те же самые всплывающие функции могут также выполнять функцию обратного вызова, когда окно снова закрывается - этот обратный вызов может использоваться для изменения страницы или, например, сохранения некоторых данных.

...