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

Architecture 事件处理程序和回调之间的区别,architecture,callback,event-handling,language-agnostic,Architecture,Callback,Event Handling,Language Agnostic,事件处理程序和回调函数之间有什么区别?事件处理程序是回调的一种类型。它在事件发生时被调用。该术语通常用于用户界面,其中的事件是移动鼠标、单击某物等。回调是作为参数传递给另一个过程的过程。接收参数的过程可以调用它,或者共享它,以便系统中的其他过程可以调用它 事件处理程序是在事件发生时调用的过程。它可以是回调。事件处理程序是来自系统的回调。一般来说,“回调”受检测进程的控制。 因此,您告诉GUI管理器“按下此按钮时调用myaction”,GUI管理器在按下此按钮时调用该操作 另一方面,事件处理程序在

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

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

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


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

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

一般来说,“回调”受检测进程的控制。 因此,您告诉GUI管理器“按下此按钮时调用
myaction
”,GUI管理器在按下此按钮时调用该操作

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


虽然“事件处理程序”模式更为复杂,但它更为健壮,在操作失败时挂起的可能性更小。它还提供了更具响应性的GUI。

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

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

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


这正是我一直以来的理解:事件处理程序是一种非常特殊的回调类型。

这个问题非常古老,但我发现这个链接非常有趣。我希望在这个问题上遇到困难的其他人都能从这个链接中得到一些东西。

詹姆斯·安德森的答案是最详细的。 扩大他的答案; 回调是指任何作为参数传递给方法的代码,这些代码将在以后异步调用。然而,回调并没有定义回调过程本身应该如何实现。这就是回调分类的起点。 传统上,回调过程看起来:

  • 开发人员定义回调并将其传递给库定义的函数(知道如何处理回调以便调用进程或检测进程可以调用它的函数),例如在节点中
var server=require('http').createServer(函数(req,res){/*您的代码*/})

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

  • 在运行时,检测进程接收回调的直接位置(因为库定义的函数为您做了这件事)并调用它。这意味着两件事:
    • 库的开发人员总是需要知道如何处理不同的检测过程,因为每个过程可能有不同的回调方式
    • 如果回调需要多次调用,它可能会执行检测过程。例如,如果检测过程是GUI过程,那么您希望GUI线程以尽可能少的任务运行,以获得流畅的GUI体验
因此,需要实现回调机制,解决了以下两个问题:

  • 一个外部进程,它将为库函数定义一个并发点来注册回调,并为检测进程定义一个并发点来通知何时需要调用这些注册的回调。
    • 这意味着这两个过程的开发人员现在可以彼此独立工作,而不必真正了解彼此的方式
    • 这个外部过程被称为事件循环(例如,在节点中)。术语“event”只是通过检测进程通知事件循环的过程,注册的回调被称为事件处理程序
  • 外部进程(或事件循环)将事件排队并执行它们,从而减轻检测进程的负担,现在可以恢复到它最擅长的状态
因此,对于多次发生的事件,事件循环或事件处理程序成为了实现回调的方式,而对于一次性事件,原始回调仍然是首选的,因为您实际上不需要为检测过程分配任务,也不需要仅为一个事件设置事件循环,因为这样做效率不高

  • 上面的node js代码是一个一次性事件(因为客户端与服务器的连接是一个一次性事件,而可以有许多响应作为事件处理程序实现),是简单回调的一个示例
      底层机制相似,但语义不同。回调和事件处理程序都是异步调用的

      回调函数通常从调用程序例程显式传递,以请求某些信息。信息在一段时间后返回,作为参数由被调用方传递回回调。此时,调用例程完成其业务。经常
      function caller() {
          someLibrary.getMeSomething(arg1, arg2, function(returnedData) {
              // this is the callback which will do something with returnedData
          });
      }
      
      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'