From 5a93b26cc30b8f1088fff96858df500acd67a228 Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Thu, 9 Feb 2023 15:53:46 +0800 Subject: [PATCH] fix: duplicate api call for cloud workspace (#928) --- .../data-center/src/provider/affine/affine.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index ee596675c2..e8e564e090 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -45,6 +45,7 @@ export class AffineProvider extends BaseProvider { private _apis: Apis; private _channel?: WebsocketClient; // private _idbMap: Map = new Map(); + private _workspaceLoadingQueue: Set = new Set(); constructor({ apis, ...params }: AffineProviderConstructorParams) { super(params); @@ -145,11 +146,13 @@ export class AffineProvider extends BaseProvider { // update workspaces this._workspaces.update(id, workspace); } else { - const workspaceUnit = await loadWorkspaceUnit( - { id, ...workspace }, - this._apis - ); - newlyCreatedWorkspaces.push(workspaceUnit); + if (!this._workspaceLoadingQueue.has(id)) { + const workspaceUnit = await loadWorkspaceUnit( + { id, ...workspace }, + this._apis + ); + newlyCreatedWorkspaces.push(workspaceUnit); + } } } else { console.log(`[log warn] ${id} name is empty`); @@ -204,6 +207,7 @@ export class AffineProvider extends BaseProvider { } override async warpWorkspace(workspace: BlocksuiteWorkspace) { + // FIXME: if add indexedDB cache in the future, can remove following line. await this._applyCloudUpdates(workspace); const { room } = workspace; assert(room); @@ -234,6 +238,7 @@ export class AffineProvider extends BaseProvider { const workspacesList = await this._apis.getWorkspaces(); const workspaceUnits = await Promise.all( workspacesList.map(w => { + this._workspaceLoadingQueue.add(w.id); return loadWorkspaceUnit( { id: w.id, @@ -246,7 +251,9 @@ export class AffineProvider extends BaseProvider { syncMode: 'core', }, this._apis - ); + ).finally(() => { + this._workspaceLoadingQueue.delete(w.id); + }); }) ); this._workspaces.add(workspaceUnits);