Базовые механизмы похожи, но семантика различна. И обратные вызовы, и обработчики событий называются асинхронно .
Функция обратного вызова обычно передается явным образом из подпрограммы вызывающей стороны для запроса некоторой информации. Информация возвращается через некоторое время и передается вызываемой стороной в качестве аргументов обратному вызову. В настоящее время процедура вызова завершает свою работу. Часто обратный вызов является закрытием - синтаксически внутри вызывающей подпрограммы и часто безымянным (анонимным). Это может выглядеть немного как ниже, в javascript:
function caller() {
someLibrary.getMeSomething(arg1, arg2, function(returnedData) {
// this is the callback which will do something with returnedData
});
}
Таким образом, вызываемый объект (someLibrary.getMeSomething) получает анонимную функцию обратного вызова, а через некоторое время эта функция вызывается с возвращенными данными. Обратный вызов похож на одноразовое событие для одного получателя.
Обработчики событий также «возвращаются», но обычно они используются в течение длительного периода для нескольких событий, таких как щелчки мыши, сетевые события и т. Д. Кроме того, несколько объектов могут интересоваться одним и тем же событием. По этим причинам вы обычно «подписываетесь» или «регистрируетесь» на события в коде установки (например, инициализация объекта), а обработчик событий обычно является именованным методом. Как правило, каждый тип события определяется как константа или строка.
Так что в Python это может выглядеть так:
class MyUIClass:
def __init__(self):
someUILib.register(someUILib.events.MOUSE_CLICK, self.my_mouse_click_handler);
def my_mouse_click_handler(self, eventInfo):
# do something with event
if eventInfo.x < 100:
print 'You clicked in the margin'