2010-01-15 168 views

回答

10

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

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

虽然“事件处理程序”模式更复杂,但它更健壮,并且在动作失败时不太可能挂起。它也使得GUI更加响应。

+0

这个答案应该被标记为已接受。 – 2016-06-21 18:09:10

26

事件处理程序是一种回调。它在事件发生时被调用。该术语通常用于用户界面,其中事件就像移动鼠标,点击某些事物等等。

+5

所以有其他情形时,回调可以被称为?除了事件?你能举出一个这样的情况的例子吗? – 2010-01-18 07:12:31

+2

@cletus,我喜欢你的答案,但你可以添加一些什么是事件处理程序和什么是回调的例子。我明白你说的是什么......但总会发生回调,因为“发生了什么事”,发生了一些事情发生99,999999%(对我的谦虚承认)是一个事件,我不会使用其他词,因此,也就是其他含义。 ..然后在那里从技术上说是同一件事。请帮助我改进我的承认。谢谢!!问候! :)。试着用这种方式思考......你能枚举其他类型的不属于特定事件的回调吗? – Victor 2014-02-26 15:27:05

36

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

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

-3

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

0

我喜欢所有这些答案如何彼此不同。

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

+0

不可互换;相反,事件处理程序是一种回调。不过,人们有时会用一种非常具体的东西来指称一般类型。 Kleenex是一个纸巾,但你不会说真的可以交替使用这些词,对吗? – 2010-01-15 06:37:25

+0

所以请埃斯特班给我们提供不是事件处理程序的回调的具体示例。就我的技术而言,在不同的基本语义方面,是相同的。感谢和问候:)。 – Victor 2014-02-26 15:33:32

8

回调(来自Wikipedia):“作为参数传递给其他代码的可执行代码”。
事件处理程序(来自Wikipedia):“异步回调子例程,处理程序中接收到的输入”。

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

9

这个问题很古老,但我发现这个链接从MSDN非常有趣。我希望任何在这个问题上绊倒的人都能从这个环节中获得一些东西。

+1

优秀的链接。谢谢。 – Tilak 2017-03-17 16:42:27

+2

有趣。解释文章:一个事件就像一条推文;任何人都可以阅读并回复它。回调就像短信一样;只有你发送的人可以阅读并回复。 – shawnhcorey 2017-06-26 01:07:41

1

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

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

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

createServer是库定义的函数,这使得确保在检测过程中到达调用正确的回调,在这种情况下是function(req, res){/* your code */}

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

因此导致用于实现回调机制,该机制解决了这些2个问题的需要:

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

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

  • 上面的节点js代码是一次性事件(如到服务器的客户机的连接是一次性事件,而可以存在将被实现为事件处理程序许多应答),并且是一个例子简单的回调。
0

底层的机制是相似的,但语义是不同的。这两个回调和事件处理程序异步调用

回调函数通常显式地传递从调用例程到要求的一些信息。这些信息会在一段时间后返回,并作为参数传递给被调用者的回调函数。此时,调用例程完成其业务。回调通常是一个闭包 - 在调用例程内的语法上,通常是未命名的(匿名)。它看起来有点像下面,在javascript:

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

所以被叫方(someLibrary.getMeSomething)给出了一个匿名的回调函数,一段时间后,这个函数被调用,returnedData。回调就像一个接收器的单发事件。

事件处理程序也被“回叫”,但通常它们被用来在延长的时间段为多个活动,如下鼠标点击,网络事件等。另外,多个对象可能有兴趣在同一事件。由于这些原因,您通常在设置代码中“订阅”或“注册”事件(如对象初始化),而事件处理程序更通常是命名方法。通常情况下,每种事件类型都被标识为常量或字符串。

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

这样做的另一个方面是,事件描述的东西,在过去发生的事情,而当有事情发生回调经常被使用。

当事件触发时,你被告知有事情发生。当使用回调时,你被要求参与某件事情。

库或框架可能发出一个让你知道事情发生的事件。框架为您提供了可以插入代码的点(可能是回调),以便您可以主动参与进程。问题的

部分原因是这种情况下,回调是指技术mcehanisms以及更抽象的过程。

+0

我认为这是最好的答案。 – 2017-06-26 09:24:00

7

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

回调 - 老板明确要求员工做任务,在任务完成后,老板希望得到通知。员工将确保任务完成后,他只通知所请求的老板,而不是所有老板都必需的。如果部分工作完成,员工将不会通知老板。只有在完成所有任务后才能完成。只有一位老板要求提供信息,而员工只会将回复发给一位老板。

相关问题