派发语义与诊断¶
事件系统同步调用监听回调,并在注册、派发、嵌套派发和诊断追踪上保持确定规则。
签名校验¶
类型事件回调必须至少接收一个事件实例参数;简单事件回调也必须至少接收一个 payload 参数。
框架会对对象方法形式的回调做运行时反射校验。参数不足、额外必填参数未通过默认值或 bind() 满足,或 bind() 后会传入超过目标方法可接收参数数量的实参时,都会输出错误并跳过注册。
同步派发¶
监听器默认同步执行。事件系统只调用回调,不会等待回调返回的 Signal。需要串行等待、失败处理、超时控制或可取消流程时,请使用 GFCommandSequence、Flow、ActionQueue 或项目层 System 调度。
exact 与 assignable 不自动去重。同一个 callable 如果同时注册到精确类型监听和 assignable 监听,可能在同一次派发中被调用两次。需要避免重复处理时,只注册其中一种,或在业务侧自行去重。
嵌套派发¶
事件回调中再次发送事件时,遍历中新增或移除的监听器会延迟到最外层派发结束后统一合并,避免内层事件提前改变外层监听器列表。
同一轮派发里先注册再注销的监听器不会在 flush 后残留,即使注册和注销的是另一个事件类型或简单事件 ID。
深度保护与 Trace¶
从 2.0.0 起,GFTypeEventSystem.max_dispatch_depth 默认使用 GFTypeEventSystem.DEFAULT_MAX_DISPATCH_DEPTH,也就是 64 层,避免递归事件链无限嵌套。确实需要不受限制的项目可显式设为 0。
trace_enabled 默认关闭,开启后可通过 Gf.get_event_dispatch_trace() 读取最近派发条目,包括轨道、事件标识、监听数量、深度和时间戳;生产环境只建议在诊断面板或临时排查中开启。