From 9048839a1b9b63474f604b3b61bd24c3659b5b01 Mon Sep 17 00:00:00 2001 From: Xc Date: Thu, 9 May 2024 20:32:59 +0800 Subject: [PATCH] =?UTF-8?q?context=20restartToExecute=E6=94=B9=E6=88=90?= =?UTF-8?q?=E6=96=B0=E4=B8=8A=E4=B8=8B=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/store/AsyncRowStore.d.ts | 1 + lib/store/AsyncRowStore.js | 9 +++------ src/store/AsyncRowStore.ts | 11 +++++------ 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/store/AsyncRowStore.d.ts b/lib/store/AsyncRowStore.d.ts index 90b32a4..7f6c89c 100644 --- a/lib/store/AsyncRowStore.d.ts +++ b/lib/store/AsyncRowStore.d.ts @@ -50,6 +50,7 @@ export declare abstract class AsyncContext implements Con abstract getCurrentUserId(allowUnloggedIn?: boolean): string | undefined; abstract setCurrentUserId(userId: string | undefined): void; abstract toString(): Promise; + abstract getSerializedData(): object; abstract initialize(data?: any, later?: boolean): Promise; abstract allowUserUpdate(): boolean; abstract openRootMode(): () => void; diff --git a/lib/store/AsyncRowStore.js b/lib/store/AsyncRowStore.js index a6c10dd..796d909 100644 --- a/lib/store/AsyncRowStore.js +++ b/lib/store/AsyncRowStore.js @@ -28,12 +28,9 @@ class AsyncContext { } // 使一个上下文重新开始事务执行,清除历史数据(定时器中使用) async restartToExecute(routine) { - const newContext = !this.uuid ? this : { - ...this, - }; // 这里可能有问题,继承的context对象中如果有对象属性会变成指针公用,但是估计目前是跑不到的。by Xc 20231215 - if (newContext !== this) { - console.warn('restartToExecute跑出了非重用当前context的情况,请仔细调试'); - } + const data = this.getSerializedData(); + const newContext = (new (Object.getPrototypeOf(this).constructor)()); + await newContext.initialize(data, true); newContext.opRecords = []; newContext.events = { commit: [], diff --git a/src/store/AsyncRowStore.ts b/src/store/AsyncRowStore.ts index cb9812a..7ba87db 100644 --- a/src/store/AsyncRowStore.ts +++ b/src/store/AsyncRowStore.ts @@ -38,12 +38,9 @@ export abstract class AsyncContext implements Context { // 使一个上下文重新开始事务执行,清除历史数据(定时器中使用) async restartToExecute(routine: (context: this) => Promise) { - const newContext = !this.uuid ? this : { - ...this, - }; // 这里可能有问题,继承的context对象中如果有对象属性会变成指针公用,但是估计目前是跑不到的。by Xc 20231215 - if (newContext !== this) { - console.warn('restartToExecute跑出了非重用当前context的情况,请仔细调试'); - } + const data = this.getSerializedData(); + const newContext = (new (Object.getPrototypeOf(this).constructor)()) as typeof this; + await newContext.initialize(data, true); newContext.opRecords = []; newContext.events = { @@ -233,6 +230,8 @@ export abstract class AsyncContext implements Context { // 此接口将上下文变成可以serialized的字符串 abstract toString(): Promise; + abstract getSerializedData(): object; + // 此接口将字符串parse成对象再进行初始化 // later表示允许延时状态,上下文要处理在时间维度上可能的异常(比如用户token已经注销等) abstract initialize(data?: any, later?: boolean): Promise;