From 849b561933d74bcc68f75f15d67e0d252c5a8468 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Tue, 16 Sep 2025 19:44:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(data-source):=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E6=95=B0=E6=8D=AE=E5=8F=98=E5=8C=96=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=93=8D=E5=BA=94=E6=94=AF=E6=8C=81=E7=AB=8B?= =?UTF-8?q?=E5=8D=B3=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/EventHelper.ts | 20 +++++++++---------- .../src/observed-data/DeepObservedData.ts | 4 ++-- .../src/observed-data/ObservedData.ts | 2 +- .../src/observed-data/SimpleObservedData.ts | 5 ++++- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/core/src/EventHelper.ts b/packages/core/src/EventHelper.ts index 5940a391..4aea3fe6 100644 --- a/packages/core/src/EventHelper.ts +++ b/packages/core/src/EventHelper.ts @@ -113,10 +113,10 @@ export default class EventHelper extends EventEmitter { } public removeNodeEvents() { - Array.from(this.nodeEventList.keys()).forEach((handler) => { + for (const handler of Array.from(this.nodeEventList.keys())) { const name = this.nodeEventList.get(handler); name && this.off(name, handler); - }); + } this.nodeEventList.clear(); } @@ -126,10 +126,10 @@ export default class EventHelper extends EventEmitter { this.removeDataSourceEvents(dataSourceList); - dataSourceList.forEach((dataSource) => { + for (const dataSource of dataSourceList) { const dataSourceEvent = this.dataSourceEventList.get(dataSource.id) ?? new Map void>(); - (dataSource.schema.events || []).forEach((event) => { + for (const event of dataSource.schema.events || []) { const [prefix, ...path] = event.name?.split('.') || []; if (!prefix) return; const handler = (...args: any[]) => { @@ -143,9 +143,9 @@ export default class EventHelper extends EventEmitter { // 数据源自定义事件 dataSource.on(prefix, handler); } - }); + } this.dataSourceEventList.set(dataSource.id, dataSourceEvent); - }); + } } public removeDataSourceEvents(dataSourceList: DataSource[]) { @@ -154,20 +154,20 @@ export default class EventHelper extends EventEmitter { } // 先清掉之前注册的事件,重新注册 - dataSourceList.forEach((dataSource) => { + for (const dataSource of dataSourceList) { const dataSourceEvent = this.dataSourceEventList.get(dataSource.id)!; if (!dataSourceEvent) return; - Array.from(dataSourceEvent.keys()).forEach((eventName) => { + for (const eventName of Array.from(dataSourceEvent.keys())) { const [prefix, ...path] = eventName.split('.'); if (prefix === DATA_SOURCE_FIELDS_CHANGE_EVENT_PREFIX) { dataSource.offDataChange(path.join('.'), dataSourceEvent.get(eventName)!); } else { dataSource.off(prefix, dataSourceEvent.get(eventName)!); } - }); - }); + } + } this.dataSourceEventList.clear(); } diff --git a/packages/data-source/src/observed-data/DeepObservedData.ts b/packages/data-source/src/observed-data/DeepObservedData.ts index 476c854c..c65af304 100644 --- a/packages/data-source/src/observed-data/DeepObservedData.ts +++ b/packages/data-source/src/observed-data/DeepObservedData.ts @@ -23,9 +23,9 @@ export class DeepObservedData extends ObservedData { update = (data: any, path?: string) => { this.state?.update(path ?? '', data); }; - on = (path: string, callback: (newVal: any) => void) => { + on = (path: string, callback: (newVal: any) => void, options?: { immediate?: boolean }) => { // subscribe 会立即执行一次,ignoreFirstCall 会忽略第一次执行 - const unsubscribe = this.state!.subscribe(path, ignoreFirstCall(callback)); + const unsubscribe = this.state!.subscribe(path, options?.immediate ? callback : ignoreFirstCall(callback)); // 把取消监听的函数保存下来,供 off 时调用 const pathSubscribers = this.subscribers.get(path) ?? new Map void>(); diff --git a/packages/data-source/src/observed-data/ObservedData.ts b/packages/data-source/src/observed-data/ObservedData.ts index ec846285..8b9a8b09 100644 --- a/packages/data-source/src/observed-data/ObservedData.ts +++ b/packages/data-source/src/observed-data/ObservedData.ts @@ -1,7 +1,7 @@ export abstract class ObservedData { abstract update(data: any, path?: string): void; - abstract on(path: string, callback: (newVal: any) => void): void; + abstract on(path: string, callback: (newVal: any) => void, options?: { immediate?: boolean }): void; abstract off(path: string, callback: (newVal: any) => void): void; diff --git a/packages/data-source/src/observed-data/SimpleObservedData.ts b/packages/data-source/src/observed-data/SimpleObservedData.ts index 0bd002fc..2a816486 100644 --- a/packages/data-source/src/observed-data/SimpleObservedData.ts +++ b/packages/data-source/src/observed-data/SimpleObservedData.ts @@ -32,7 +32,10 @@ export class SimpleObservedData extends ObservedData { this.event.emit('', changeEvent); } - on(path: string, callback: (newVal: any) => void): void { + on(path: string, callback: (newVal: any) => void, options?: { immediate?: boolean }): void { + if (options?.immediate) { + callback(this.getData(path)); + } this.event.on(path, callback); }