From 8a934348a6050251a06217138e1238e9f26e746b Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Sat, 20 Dec 2025 17:02:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(event-bus.js):=20=20defaultAsyncHandler=20?= =?UTF-8?q?=E7=9A=84=E8=BF=94=E5=9B=9E=E5=80=BC=EF=BC=8C=E8=A2=AB=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/js/event-bus.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/common/js/event-bus.js b/common/js/event-bus.js index d19be53..9d2fb5a 100644 --- a/common/js/event-bus.js +++ b/common/js/event-bus.js @@ -110,19 +110,23 @@ class EventBus { // 异步触发事件,支持取消传播,并支持在监听处理后调用异步函数 defaultAsyncHandler // 使用方式:await eventBus.emit(eventName, data, defaultAsyncHandler) - // defaultAsyncHandler 会在每个监听器执行后被调用,签名为 defaultAsyncHandler(event, handler, handlerResult) + // defaultAsyncHandler 会在监听器执行后被调用,签名为 defaultAsyncHandler(event, handler, handlerResult) // 如果 defaultAsyncHandler 返回 Promise,会等待其 resolve // 如果 allowContinuePropagation 为 false,事件触发后将立即返回,不继续传播 // 如果 stopOnError 为 true,在任意监听器抛出错误后立即停止传播 // 如果 allowAsyncHandlerRun 为 true,在每个监听器执行后调用 defaultAsyncHandler // 如果 allowAsyncHandlerRun 为 false,不调用 defaultAsyncHandler // 注意:如果 allowAsyncHandlerRun 为 false,defaultAsyncHandler 不会被调用,也不会等待其 resolve - async emit(eventName, data, defaultAsyncHandler, { allowContinuePropagation = true, stopOnError = false, allowAsyncHandlerRun = true } = {}) { + // 定义一个设置每个监听器执行后,是否都要调用 defaultAsyncHandler + // 如果 callDefaultAsyncHandlerAfterEachListener 为 true,每个监听器执行后都调用 defaultAsyncHandler + // 如果 callDefaultAsyncHandlerAfterEachListener 为 false,只在所有监听器执行完毕后调用 defaultAsyncHandler + async emit(eventName, data, defaultAsyncHandler, { allowContinuePropagation = true, stopOnError = false, allowAsyncHandlerRun = true, callDefaultAsyncHandlerAfterEachListener = false } = {}) { // 先创建事件对象,方便传入 defaultAsyncHandler const event = this.createEvent(eventName, data) // helper to call defaultAsyncHandler only when allowed const callDefaultAsyncHandler = async (evt, handler, handlerResult) => { + // console.log('callDefaultAsyncHandler', {evt, handler, handlerResult}); if (typeof defaultAsyncHandler !== 'function' || !allowAsyncHandlerRun) return try { const res = defaultAsyncHandler(evt, handler, handlerResult) @@ -198,12 +202,16 @@ class EventBus { } // 在每个监听器执行后,如果允许并且提供了 defaultAsyncHandler,就调用并等待它 - await callDefaultAsyncHandler(event, handler, awaitedResult) + if (callDefaultAsyncHandlerAfterEachListener && allowAsyncHandlerRun) { + await callDefaultAsyncHandler(event, handler, awaitedResult) + } } catch (error) { console.error(`EventBus ${eventName} error:`, error) // 发现错误,默认调用 defaultAsyncHandler(仅当允许) - await callDefaultAsyncHandler(event, handler, true) + if (allowAsyncHandlerRun && callDefaultAsyncHandlerAfterEachListener) { + await callDefaultAsyncHandler(event, handler, true) + } // 如果全局或该 handler 指定遇错停止传播,则停止 if (stopOnError || handler.options?.stopOnError) { @@ -218,6 +226,11 @@ class EventBus { } } + // 如果 callDefaultAsyncHandlerAfterEachListener 为 false,只在所有监听器执行完毕后调用 defaultAsyncHandler + if (!callDefaultAsyncHandlerAfterEachListener && allowAsyncHandlerRun) { + await callDefaultAsyncHandler(event, null, true) + } + return !event.defaultPrevented }