From f57f5be073d3d8a392745bafa5a6faa686720df1 Mon Sep 17 00:00:00 2001 From: Lucio Lelii Date: Fri, 10 Apr 2026 09:26:31 +0200 Subject: [PATCH] race condiiton on node schema loading solved --- src/app/services/blocks/blocks.ts | 9 ++++++++- src/app/services/containers/containers.ts | 9 ++++++++- src/app/shared/nodes/generic-node/generic-node.ts | 7 +++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/app/services/blocks/blocks.ts b/src/app/services/blocks/blocks.ts index 6442d30..92c38ee 100644 --- a/src/app/services/blocks/blocks.ts +++ b/src/app/services/blocks/blocks.ts @@ -23,13 +23,15 @@ export class BlocksService { readonly catalogLoading = this._catalogLoading.asReadonly(); hasLoadedBlockTypes() { - return this._blockTypes().length > 0 || !this.toInit; + return this._blockTypes().length > 0 || (!this.toInit && !this.loadingPromise); } async getAllBlocksTypes() { if (this.toInit) { this.toInit = false; await this.refresh(); + } else if (this.loadingPromise) { + await this.loadingPromise; } return this._blockTypes.asReadonly(); @@ -65,6 +67,11 @@ export class BlocksService { const current = this._blockTypes().find((blockType) => blockType.type === typeName); if (current) return current; + if (this.loadingPromise) { + await this.loadingPromise; + return this._blockTypes().find((blockType) => blockType.type === typeName); + } + this._catalogLoading.set(true); const blockTypes = await firstValueFrom(this.blocksCallService.retrieveAllBlocksTypes()) .finally(() => { diff --git a/src/app/services/containers/containers.ts b/src/app/services/containers/containers.ts index 8a20729..79d844f 100644 --- a/src/app/services/containers/containers.ts +++ b/src/app/services/containers/containers.ts @@ -23,13 +23,15 @@ export class ContainersService { readonly catalogLoading = this._catalogLoading.asReadonly(); hasLoadedContainerTypes() { - return this._containerTypes().length > 0 || !this.toInit; + return this._containerTypes().length > 0 || (!this.toInit && !this.loadingPromise); } async getAllContainerTypes() { if (this.toInit) { this.toInit = false; await this.refresh(); + } else if (this.loadingPromise) { + await this.loadingPromise; } return this._containerTypes.asReadonly(); @@ -65,6 +67,11 @@ export class ContainersService { const current = this._containerTypes().find((containerType) => containerType.type === typeName); if (current) return current; + if (this.loadingPromise) { + await this.loadingPromise; + return this._containerTypes().find((containerType) => containerType.type === typeName); + } + this._catalogLoading.set(true); const containerTypes = await firstValueFrom(this.containersCallService.retrieveAllContainerTypes()) .finally(() => { diff --git a/src/app/shared/nodes/generic-node/generic-node.ts b/src/app/shared/nodes/generic-node/generic-node.ts index 5da44bd..6353e2a 100644 --- a/src/app/shared/nodes/generic-node/generic-node.ts +++ b/src/app/shared/nodes/generic-node/generic-node.ts @@ -614,6 +614,13 @@ export class GenericNodeComponent { } finally { this.schemaLoading = false; this.schemaReady = true; + queueMicrotask(() => { + try { + this.cdr.detectChanges(); + } catch { + // Node may have been removed while schema was loading. + } + }); } }