feat(data-source): 由于存在异步加载数据源,新增所有数据源加载完毕事件

This commit is contained in:
roymondchen 2025-05-21 16:24:35 +08:00
parent 1e396d4a8d
commit a35789c0cf

View File

@ -89,45 +89,46 @@ class DataSourceManager extends EventEmitter {
if (initialData) { if (initialData) {
this.initialData = initialData; this.initialData = initialData;
this.data = initialData; this.data = { ...initialData };
} }
app.dsl?.dataSources?.forEach((config) => { app.dsl?.dataSources?.forEach((config) => {
this.addDataSource(config); this.addDataSource(config);
}); });
const dataSourceList = Array.from(this.dataSourceMap); this.on('registered-all', () => {
const dataSourceList = Array.from(this.dataSourceMap);
if (typeof Promise.allSettled === 'function') {
Promise.allSettled<Record<string, any>>(dataSourceList.map(([, ds]) => this.init(ds))).then((values) => {
const data: DataSourceManagerData = {};
const errors: Record<string, Error> = {};
if (typeof Promise.allSettled === 'function') { values.forEach((value, index) => {
Promise.allSettled<Record<string, any>>(dataSourceList.map(([, ds]) => this.init(ds))).then((values) => { const dsId = dataSourceList[index][0];
const data: DataSourceManagerData = {}; if (value.status === 'fulfilled') {
const errors: Record<string, Error> = {}; if (this.data[dsId]) {
data[dsId] = this.data[dsId];
values.forEach((value, index) => { } else {
const dsId = dataSourceList[index][0]; delete data[dsId];
if (value.status === 'fulfilled') { }
if (this.data[dsId]) { } else if (value.status === 'rejected') {
data[dsId] = this.data[dsId];
} else {
delete data[dsId]; delete data[dsId];
errors[dsId] = value.reason;
} }
} else if (value.status === 'rejected') { });
delete data[dsId];
errors[dsId] = value.reason;
}
});
this.emit('init', data, errors); this.emit('init', data, errors);
});
} else {
Promise.all<Record<string, any>>(dataSourceList.map(([, ds]) => this.init(ds)))
.then(() => {
this.emit('init', this.data);
})
.catch(() => {
this.emit('init', this.data);
}); });
} } else {
Promise.all<Record<string, any>>(dataSourceList.map(([, ds]) => this.init(ds)))
.then(() => {
this.emit('init', this.data);
})
.catch(() => {
this.emit('init', this.data);
});
}
});
} }
public async init(ds: DataSource) { public async init(ds: DataSource) {
@ -202,6 +203,10 @@ class DataSourceManager extends EventEmitter {
this.setData(ds, changeEvent); this.setData(ds, changeEvent);
}); });
if (!this.app.dsl?.dataSources || this.dataSourceMap.size === this.app.dsl.dataSources.length) {
this.emit('registered-all');
}
return ds; return ds;
} }
@ -221,20 +226,22 @@ class DataSourceManager extends EventEmitter {
* @param {DataSourceSchema[]} schemas * @param {DataSourceSchema[]} schemas
*/ */
public updateSchema(schemas: DataSourceSchema[]) { public updateSchema(schemas: DataSourceSchema[]) {
schemas.forEach((schema) => { for (const schema of schemas) {
const ds = this.get(schema.id); const ds = this.get(schema.id);
if (!ds) { if (!ds) {
return; return;
} }
this.removeDataSource(schema.id); this.removeDataSource(schema.id);
}
for (const schema of schemas) {
this.addDataSource(cloneDeep(schema)); this.addDataSource(cloneDeep(schema));
const newDs = this.get(schema.id); const newDs = this.get(schema.id);
if (newDs) { if (newDs) {
this.init(newDs); this.init(newDs);
} }
}); }
} }
/** /**