fix(event-bus.js): defaultAsyncHandler 的返回值,被截

This commit is contained in:
2025-12-20 17:02:24 +08:00
parent 973c8dddd0
commit 8a934348a6

View File

@@ -110,19 +110,23 @@ class EventBus {
// 异步触发事件,支持取消传播,并支持在监听处理后调用异步函数 defaultAsyncHandler // 异步触发事件,支持取消传播,并支持在监听处理后调用异步函数 defaultAsyncHandler
// 使用方式await eventBus.emit(eventName, data, defaultAsyncHandler) // 使用方式await eventBus.emit(eventName, data, defaultAsyncHandler)
// defaultAsyncHandler 会在每个监听器执行后被调用,签名为 defaultAsyncHandler(event, handler, handlerResult) // defaultAsyncHandler 会在监听器执行后被调用,签名为 defaultAsyncHandler(event, handler, handlerResult)
// 如果 defaultAsyncHandler 返回 Promise会等待其 resolve // 如果 defaultAsyncHandler 返回 Promise会等待其 resolve
// 如果 allowContinuePropagation 为 false事件触发后将立即返回不继续传播 // 如果 allowContinuePropagation 为 false事件触发后将立即返回不继续传播
// 如果 stopOnError 为 true在任意监听器抛出错误后立即停止传播 // 如果 stopOnError 为 true在任意监听器抛出错误后立即停止传播
// 如果 allowAsyncHandlerRun 为 true在每个监听器执行后调用 defaultAsyncHandler // 如果 allowAsyncHandlerRun 为 true在每个监听器执行后调用 defaultAsyncHandler
// 如果 allowAsyncHandlerRun 为 false不调用 defaultAsyncHandler // 如果 allowAsyncHandlerRun 为 false不调用 defaultAsyncHandler
// 注意:如果 allowAsyncHandlerRun 为 falsedefaultAsyncHandler 不会被调用,也不会等待其 resolve // 注意:如果 allowAsyncHandlerRun 为 falsedefaultAsyncHandler 不会被调用,也不会等待其 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 // 先创建事件对象,方便传入 defaultAsyncHandler
const event = this.createEvent(eventName, data) const event = this.createEvent(eventName, data)
// helper to call defaultAsyncHandler only when allowed // helper to call defaultAsyncHandler only when allowed
const callDefaultAsyncHandler = async (evt, handler, handlerResult) => { const callDefaultAsyncHandler = async (evt, handler, handlerResult) => {
// console.log('callDefaultAsyncHandler', {evt, handler, handlerResult});
if (typeof defaultAsyncHandler !== 'function' || !allowAsyncHandlerRun) return if (typeof defaultAsyncHandler !== 'function' || !allowAsyncHandlerRun) return
try { try {
const res = defaultAsyncHandler(evt, handler, handlerResult) const res = defaultAsyncHandler(evt, handler, handlerResult)
@@ -198,12 +202,16 @@ class EventBus {
} }
// 在每个监听器执行后,如果允许并且提供了 defaultAsyncHandler就调用并等待它 // 在每个监听器执行后,如果允许并且提供了 defaultAsyncHandler就调用并等待它
await callDefaultAsyncHandler(event, handler, awaitedResult) if (callDefaultAsyncHandlerAfterEachListener && allowAsyncHandlerRun) {
await callDefaultAsyncHandler(event, handler, awaitedResult)
}
} catch (error) { } catch (error) {
console.error(`EventBus ${eventName} error:`, error) console.error(`EventBus ${eventName} error:`, error)
// 发现错误,默认调用 defaultAsyncHandler仅当允许 // 发现错误,默认调用 defaultAsyncHandler仅当允许
await callDefaultAsyncHandler(event, handler, true) if (allowAsyncHandlerRun && callDefaultAsyncHandlerAfterEachListener) {
await callDefaultAsyncHandler(event, handler, true)
}
// 如果全局或该 handler 指定遇错停止传播,则停止 // 如果全局或该 handler 指定遇错停止传播,则停止
if (stopOnError || handler.options?.stopOnError) { 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 return !event.defaultPrevented
} }