事件处理程序和callback之间的区别
事件处理程序和callback函数有什么区别?
一般来说,“callback”是在检测过程的控制下进行的。 所以你告诉一个GUIpipe理器“按下这个button时调用myaction
”,GUIpipe理器在按下button时调用这个动作。
另一方面,事件处理程序在一个步骤中被移除。 GUIpipe理器被configuration为将消息发送到事件处理程序。 你告诉一个事件pipe理器,这个button被myaction
程序处理。 当button被按下时,GUIpipe理器在事件处理程序队列上放置一条消息,并通过GUI进行pipe理,事件处理程序从队列中拾取消息,看到它是一个button推送,触发myaction
程序,然后继续处理下一个事件。 通常myaction
程序将作为一个独立的线程运行,甚至是一个独立的进程。
虽然“事件处理程序”模式更复杂,但它更强大,不太可能挂起一个动作失败。 它也使一个更敏感的graphics用户界面。
callback是您作为parameter passing给另一个过程的过程。 接收参数的过程可以调用它,或者共享它,以便系统中的其他一些程序可以调用它。
事件处理程序是事件发生时调用的过程。 它可以是一个callback。
事件处理程序是一种callbacktypes。 每当发生事件时都会调用它。 该术语通常用于用户界面,其中事件是像移动鼠标,点击某些事物等等。
callback(来自维基百科) :“作为parameter passing给其他代码的可执行代码”。
事件处理程序(来自维基百科) :“处理程序中收到的input的asynchronouscallback子程序”。
这正好是我一直理解的方式:事件处理程序是一个非常特定的callbacktypes。
这个问题很老,但是我发现这个来自MSDN的链接非常有趣。 我希望任何在这个问题上绊倒的人都能从这个环节中获得一些东西。
事件 – 考虑一个服务器(员工)和客户(老板)。一个员工可以有很多老板。 员工在完成任务时提出事件,老板可能决定倾听员工事件。员工是出版商,老板是订阅者。
回电 – 老板特意要求员工做任务,在完成任务后,老板要通知。 员工将确保任务完成后,只通知所请求的老板,而不是所有的老板都需要。 如果部分工作完成,员工将不会通知老板。 只有在完成所有任务之后才能完成。只有一位老板要求提供信息,而员工只会向一位老板回复。
另外一个方面是事件描述了过去发生的事情,而一些事件正在经常使用callback。
当事件发生时,你会被告知发生了一些事情。 当使用callback时,你被要求参与某些事情。
图书馆或框架可能会发布事件,让你知道发生了什么事情。 一个框架为您提供了可以插入代码的点(也许作为callback),以便您可以主动参与进程。
问题的一部分是事件,callback参考技术mcehanisms以及更抽象的过程。
詹姆斯·安德森的答案是最详细的。 扩大他的答案; callback是指任何代码,作为parameter passing给一个方法,打算在以后asynchronous调用。 但是,callback并没有定义如何执行callback本身的过程。 这是callback的分类开始的地方。 传统上,callback过程看起来像:
- 开发人员定义了一个callback函数,并将其传递到一个库函数中(例如知道该函数如何处理,以便调用进程或检测进程可以调用它)
var server = require('http').createServer(function(req, res){/* your code */});
createServer
是库定义的函数,它确保检测过程调用正确的callback,在这种情况下是function(req, res){/* your code */}
- 在运行时,检测进程接收callback的直接位置(因为库定义函数为你做)并调用它。 这将意味着2件事情:
- 图书馆的开发人员总是需要知道如何处理不同的检测过程,因为每个过程都有不同的callback方式
- 如果需要多次调用callback,则可能需要进行检测。 例如,如果检测过程是一个GUI过程,那么您将希望GUI线程以尽可能less的任务运行,以获得stream畅的GUI体验。
从而导致需要实现callback机制,解决了这两个问题:
- 一个外部进程,它将为库函数定义一个并发点来注册callback函数,检测进程通知这些注册callback函数何时需要被调用。
- 这意味着这两个进程的开发人员现在可以彼此独立工作,而不必真正了解彼此的方式。
- 这个外部过程被称为事件循环(在节点中,例如)。 术语“事件”仅仅是检测过程通知事件循环的过程,而注册的callback被称为事件处理程序。
- 外部进程(或事件循环)将事件排队并执行它们,从而将检测过程中的负载从现在恢复到最佳状态。
因此,对于多次发生的事件,事件循环或事件处理程序成为实现callback的方式, 而原始callback仍然是首选的一次性事件,因为您不是真正负责检测过程,也不需要事件循环只是一个事件,因为它不高效。
- 上面的节点js代码是一次性事件(因为连接到客户端的服务器是一次性事件,而可以有许多响应被实现为事件处理程序)并且是简单callback的示例。
我喜欢所有这些答案如何彼此不同。
我将从这里得出结论,从术语的angular度来看,事件和callback是可以互换的。 他们在特定的编程语言或框架中的含义不同,因为任何平台都倾向于select他们喜欢的术语。
基本的机制是相似的,但是语义是不同的。 这两个callback和事件处理程序都是asynchronous调用的。
callback函数通常是从调用者例程中明确地传递来请求一些信息。 信息在一段时间之后被返回,并作为parameter passing给被调用者的callback。 此时,调用例程完成其业务。 通常callback是一个闭包 – 在调用例程内部,通常是非命名的(匿名)。 它可能看起来有点像下面,在JavaScript中:
function caller() { someLibrary.getMeSomething(arg1, arg2, function(returnedData) { // this is the callback which will do something with returnedData }); }
所以被调用者(someLibrary.getMeSomething)被赋予了一个匿名的callback函数,并且一段时间后这个函数被与returnedData一起调用。 callback就像一个单一的接收器一个事件。
事件处理程序也被“callback”,但是通常它们被用于多个事件的延长时间,如鼠标点击,networking事件等。而且,多个对象可能对同一事件感兴趣。 由于这些原因,您通常在设置代码中(如对象初始化)“订阅”或“注册”事件,事件处理程序更通常是命名方法。 通常,每个事件types都被标识为常量或string。
所以在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'
事件处理程序是来自系统的callback。