fix(event-bus.js): defaultAsyncHandler 的返回值,被截
This commit is contained in:
@@ -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 为 false,defaultAsyncHandler 不会被调用,也不会等待其 resolve
|
// 注意:如果 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
|
// 先创建事件对象,方便传入 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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user