事件处理程序和回调之间的区别

时间:2010-01-15 05:57:09

标签: architecture callback event-handling language-agnostic

事件处理程序和回调函数之间有什么区别?

14 个答案:

答案 0 :(得分:43)

回调是您作为参数传递给另一个过程的过程。接收参数的过程可以调用它,或者共享它,以便系统中的其他一些过程可以调用它。

事件处理程序是事件发生时调用的过程。它可以是一个回调。

答案 1 :(得分:30)

事件处理程序是一种回调。只要事件发生就会调用它。该术语通常用于用户界面,其中事件是移动鼠标,点击某些内容等等。

答案 2 :(得分:17)

一般来说,'回调'是在检测过程的控制之下。 因此,当告诉GUI管理器“按下此按钮时调用myaction”,GUI管理器会在按下按钮时调用该操作。

另一方面,

事件处理程序在一步操作中被删除。 GUI管理器配置为将消息发送到事件处理程序。您告诉事件管理器按钮按下由myaction程序处理。当按下按钮时,GUI管理器将消息放在事件处理程序队列上并继续GUI管理,事件处理程序从队列中获取消息,看到它是按钮按下,启动myaction程序,并继续处理下一个事件。通常,myaction程序将作为独立线程运行,甚至是单独的进程。

虽然“事件处理程序”模式更复杂,但它更强大,并且在操作失败时不太可能挂起。它还可以提供更具响应性的GUI。

答案 3 :(得分:10)

回调(来自维基百科):“作为参数传递给其他代码的可执行代码”。
事件处理程序(同样来自维基百科):“异步回调子程序,用于处理程序中收到的输入”。

这恰好是我一直理解的方式:事件处理程序是一种非常特殊的回调类型。

答案 4 :(得分:10)

这个问题很老但我发现MSDN的链接非常有趣。我希望遇到这个问题的其他任何人都能从这个链接中获得一些东西。

答案 5 :(得分:8)

事件 - 想想服务器(员工)和客户(老板)。一个员工可以有很多老板。员工在完成任务时提出事件,并且老板可能决定是否听取员工事件。员工是出版商,老板是订户。

回调 - Boss特意要求员工完成任务,在完成任务结束时,Boss希望得到通知。员工将确保在任务完成时,他只通知所要求的老板,而不是所有老板。如果部分工作完成,员工将不会通知Boss。只有在完成所有任务后才会完成。只有一位老板要求提供信息,员工只将答复发布给一位老板。

答案 6 :(得分:4)

这方面的另一个方面是事件描述了过去发生的事情,而事件发生时经常使用回调。

当事件发生时,您会被告知事情已经发生。使用回调时,系统会要求您参与回复。

库或框架可能会发出事件,让您知道发生了什么。框架为您提供了插入代码的点(可能作为回调),以便您可以积极参与流程。

问题的一部分是事件,回调是指技术性的mcehanism以及更抽象的过程。

答案 7 :(得分:1)

詹姆斯安德森的回答是最详细的。 扩大他的答案; 回调是指任何代码,它作为参数传递给方法,打算稍后异步调用。但是,回调并没有定义如何实现回调本身的过程。这是回调分类开始的地方。 传统上,回调过程看起来是:

  • 开发人员定义一个回调并将其传递给库定义的函数(一个知道如何处理回调,以便调用进程或检测进程可以调用它),例如在节点中,

var server = require('http').createServer(function(req, res){/* your code */});

createServer是库定义的函数,它确保检测过程调用正确的回调,在本例中为function(req, res){/* your code */}

  • 在运行时,检测过程接收回调的直接位置(因为库定义的函数为你做了)并调用它。这意味着两件事:
    • 图书馆的开发人员总是需要知道如何处理不同的检测过程,因为每个人可能有不同的回电方式
    • 如果需要多次调用回调,它可能会对检测过程负责。对于例如如果检测过程是一个GUI过程,那么您希望GUI线程以尽可能少的任务运行,以获得流畅的GUI体验。

因此需要实现回调机制,这解决了这两个问题:

  • 一个外部进程,它定义库函数的并发点以注册回调,并为检测进程通知何时需要调用这些已注册的回调。
    • 这意味着这两个流程的开发人员现在可以彼此独立工作,而不会真正了解彼此的方式。
    • 这个外部过程被称为事件循环(例如,在节点中)。术语“事件”只是通过检测过程通知事件循环的过程,并且已注册的回调被称为事件处理程序。
  • 外部进程(或事件循环)将事件排队并执行它们,从而减轻检测过程的负担,现在可以恢复到最佳状态。

因此,对于多次发生的事件,事件循环或事件处理程序成为实现回调的方式,,而原始回调仍然是首选事件的首选,因为您并不是真正的任务检测过程并不需要为一个事件设置事件循环,因为它效率不高。

  • 上面的节点js代码是一次性事件(因为与客户端的服务器的连接是一次性事件,而可以有许多响应被实现为事件处理程序)并且是简单回调的示例。

答案 8 :(得分:1)

底层机制类似,但语义不同。回调和事件处理程序都称为异步

回调函数通常从调用程序例程显式传递,以请求一些信息。一段时间后返回信息,作为参数传递回被调用者的回调。此时,调用例程完成其业务。通常,回调是一个闭包 - 在语法例程中语法化,通常是未命名的(匿名)。它有点像下面的javascript:

function caller() {
    someLibrary.getMeSomething(arg1, arg2, function(returnedData) {
        // this is the callback which will do something with returnedData
    });
}

因此callee(someLibrary.getMeSomething)被赋予一个匿名回调函数,一段时间后,这个函数被returnData调用。回调就像是单个接收器的单次事件。

事件处理程序也被“回调”,但通常它们会在很长一段时间内用于多个事件,例如鼠标点击,网络事件等。此外,多个对象可能对同一事件感兴趣。出于这些原因,您通常会“订阅”或“注册”设置代码中的事件(如对象初始化),事件处理程序通常是命名方法。通常,每个事件类型都被标识为常量或字符串。

所以在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'

答案 9 :(得分:0)

我喜欢这些答案之间的差异。

我将从中得出结论,从术语的角度来看,事件和回调是可以互换的。它们在特定编程语言或框架中的含义有所不同,因为任何平台都倾向于选择自己喜欢的术语。

答案 10 :(得分:0)

回调是作为参数传递给另一个函数(方法)的函数(方法)。接收参数的函数可以调用它,也可以共享它,以便系统中的其他函数可以调用它。

事件处理程序是事件发生时调用的函数(方法)。可以是回调。

答案 11 :(得分:0)

事件具有特殊功能,例如冒泡等。如果您不需要这些功能,那么只需使用回调即可。

答案 12 :(得分:-1)

回调是要求另一个函数做业务操作并发送结果,而事件不是,而是要求移交控制权,以便我们只能处理业务操作。

例如:按钮点击是事件(我们在点击按钮时进行业务操作)。由于 forEach 方法正在执行业务操作并提供结果,因此在回调中循环集合。

答案 13 :(得分:-3)

事件处理程序是系统的回调。