注意:这里的问题是专门针对Matlab的!
这个问题的上下文是一个Matlab句柄类,它通过websocket接收一些数据,对这些数据进行一些处理,然后将数据转发给其他一些类,这些类用回调注册自己。
该类的简化版本如下:
classdef ReceiverWebsocket < WebSocketClient
properties (Access = private)
dataReceivers_ % Stores the callback functions and their desired rate
end
methods
function obj = ROSReceiverWebsocket(TOPIC, URI, varargin)
obj = obj@WebSocketClient(URI, varargin{:});
obj.dataReceivers_ = containers.Map;
end
function registerReceiver(obj, name, rate, callback)
cb.name = name;
cb.callback = callback;
obj.dataReceivers_(name) = cb;
end
% Implement the abstract callback functions
function onTextMessage(obj,message)
data = jsondecode(message);
for key = keys(obj.dataReceivers_)
cb = obj.dataReceivers_(cell2mat(key));
cb.callback(data);
end
end
end
end
在研究如何在Matlab中实现这样的功能时,我还发现了Matlab中事件侦听器和通知器的概念。
根据这一点,我可以使用句柄类事件重新实现上述功能,然后在onTextMessage(...)
函数中调用notify(...)
,而不是直接调用回调函数。
我现在的问题是,如果有:
- 与直接回调相比,使用事件侦听器功能有什么好处
- 使用直接回调有什么缺点吗
我特别找不到关于通知的事件回调是如何执行的,关于执行顺序、任何执行延迟甚至在不同线程中执行的任何信息。
一如既往,这取决于您的用例。
就我个人而言,我认为使用事件的主要优势在于,您可以由单个事件触发多个侦听器(无需额外编码,请参阅此处的示例:https://mathworks.com/matlabcentral/answers/13305-can-timers-trigger-a-single-event-that-many-objects-listen-to)。
它还允许您使用可能不同的参数列表进行回调,而在您的示例中,回调函数必须只接受一个参数,即数据。
关于执行令(https://de.mathworks.com/help/matlab/matlab_oop/callback-execution.html#bu0b2f4):
事件触发后侦听器回调函数的执行顺序未定义。但是,所有侦听器回调都与事件触发同步执行。