feat(core): 异步加载dsl片段下,事件触发时node可能不存在

This commit is contained in:
roymondchen 2025-07-22 20:23:14 +08:00
parent 2605011df4
commit 01b88dba25
2 changed files with 47 additions and 0 deletions

View File

@ -31,6 +31,7 @@ import {
type DataSourceItemConfig, type DataSourceItemConfig,
type EventActionItem, type EventActionItem,
type EventConfig, type EventConfig,
Id,
NODE_DISABLE_CODE_BLOCK_KEY, NODE_DISABLE_CODE_BLOCK_KEY,
NODE_DISABLE_DATA_SOURCE_KEY, NODE_DISABLE_DATA_SOURCE_KEY,
} from '@tmagic/schema'; } from '@tmagic/schema';
@ -41,8 +42,17 @@ import FlowState from './FlowState';
import type { default as TMagicNode } from './Node'; import type { default as TMagicNode } from './Node';
import { AfterEventHandler, BeforeEventHandler } from './type'; import { AfterEventHandler, BeforeEventHandler } from './type';
interface EventCache {
toId: Id;
method: string;
fromCpt: any;
args: any[];
handled?: boolean;
}
export default class EventHelper extends EventEmitter { export default class EventHelper extends EventEmitter {
public app: TMagicApp; public app: TMagicApp;
public eventQueue: EventCache[] = [];
private nodeEventList = new Map<(fromCpt: TMagicNode, ...args: any[]) => void, symbol>(); private nodeEventList = new Map<(fromCpt: TMagicNode, ...args: any[]) => void, symbol>();
private dataSourceEventList = new Map<string, Map<string, (...args: any[]) => void>>(); private dataSourceEventList = new Map<string, Map<string, (...args: any[]) => void>>();
@ -160,6 +170,14 @@ export default class EventHelper extends EventEmitter {
this.dataSourceEventList.clear(); this.dataSourceEventList.clear();
} }
public getEventQueue() {
return this.eventQueue;
}
public addEventToQueue(event: EventCache) {
this.eventQueue.push(event);
}
/** /**
* *
* @param eventsConfigIndex node.event中获取最新事件配置 * @param eventsConfigIndex node.event中获取最新事件配置
@ -271,6 +289,16 @@ export default class EventHelper extends EventEmitter {
} }
} }
if (toNodes.length === 0) {
this.addEventToQueue({
toId: to,
method: methodName,
fromCpt,
args,
});
return;
}
const instanceMethodPropmise = []; const instanceMethodPropmise = [];
for (const node of toNodes) { for (const node of toNodes) {
if (node.instance) { if (node.instance) {

View File

@ -202,6 +202,25 @@ class Node extends EventEmitter {
} }
} }
if (this.app.eventHelper) {
for (const eventConfig of this.app.eventHelper.getEventQueue()) {
for (const [, page] of this.app.pageFragments) {
const node = page.getNode(eventConfig.toId);
if (node && node === this) {
if (typeof instance[eventConfig.method] === 'function') {
await instance[eventConfig.method](eventConfig.fromCpt, ...eventConfig.args);
}
eventConfig.handled = true;
}
}
}
this.app.eventHelper.eventQueue = this.app.eventHelper
.getEventQueue()
.filter((eventConfig) => !eventConfig.handled);
}
if (this.data[NODE_DISABLE_CODE_BLOCK_KEY] !== true) { if (this.data[NODE_DISABLE_CODE_BLOCK_KEY] !== true) {
this.runHookCode('mounted'); this.runHookCode('mounted');
} }